PostgreSQL使用函数实现merge功能
PostgreSQL使用函数实现merge功能
实验环境
操作系统:windows 10 家庭中文版
数据库系统: PostgreSQL 9.6.2
说明
oracle数据库中有merge函数,可在插入数据前判断:如果指定列数据不存在,则正常插入数据;如果指定列数据存在,则将此条数据更新为插入的数据。
postgresql数据库中没有类似自带函数,只能自己实现此功能
实验
开启数据库:
psql (9.6.2)
postgres=# \l数据库列表名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限
-------------+----------+----------+--------------------------------+--------------------------------+-----------------------ag01xinku | postgres | UTF8 | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |postgres | postgres | UTF8 | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |template0 | postgres | UTF8 | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres +| | | | | postgres=CTc/postgrestemplate1 | postgres | UTF8 | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres +| | | | | postgres=CTc/postgrestest | postgres | UTF8 | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |wcm20171005 | postgres | UTF8 | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |
(6 行记录)postgres=# \c test
创建测试表db,并插入测试数据:
test=# CREATE TABLE db (a INT PRIMARY KEY, b TEXT);
CREATE TABLE
test=# INSERT INTO db VALUES(1,'1');
INSERT 0 1
test=# INSERT INTO db VALUES(2,'2');
INSERT 0 1
test=# SELECT a,b FROM db;a | b
---+---1 | 12 | 2
(2 行记录)
针对这个表创建merge函数:
test=# CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
test-# $$
test$# BEGIN
test$# LOOP
test$# UPDATE db SET b = data WHERE a = key;
test$# IF found THEN
test$# RETURN;
test$# END IF;
test$#
test$# BEGIN
test$# INSERT INTO db(a,b) VALUES (key, data);
test$# RETURN;
test$# EXCEPTION WHEN unique_violation THEN
test$# -- do nothing
test$# END;
test$# END LOOP;
test$# END;
test$# $$
test-# LANGUAGE plpgsql;
CREATE FUNCTION
测试
使用merge函数插入key列字段已经在表中存在的数据:
test=# SELECT merge_db(1, 'a');merge_db
----------(1 行记录)
检查可发现,key字段为1的数据被更新了
test=# SELECT a,b FROM db;
a | b
---+---
2 | 2
1 | a
(2 行记录)
再尝试使用merge函数插入key列字段已经在表中不存在的数据:
test=# SELECT merge_db(3, 'c');merge_db
----------(1 行记录)
检查可发现数据直接插入了表中
test=# SELECT a,b FROM db;
a | b
---+---
2 | 2
1 | a
3 | c
(3 行记录)
功能实现!
小结
此方法只实现了oracle中merge函数的部分功能,而最大的问题是必须针对每个表创建自己的merge函数,比较适合在进行数据库迁移的时候配合外部表和触发器使用,而在正常业务环境中使用机会不多。
原文地址http://www.bieryun.com/3263.html
PostgreSQL使用函数实现merge功能相关推荐
- PostgreSQL常用函数以及操作符
一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是PostgreSQL中提供的比较操作符列表: 操作符 描述 < ...
- PostgreSQL之函数和操作符
一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是PostgreSQL中提供的比较操作符列表: 操作符 描述 < ...
- 让你的javascript函数拥有记忆功能,降低全局变量的使用
考虑例如以下场景:假如我们须要在界面上画一个圆,初始的时候界面是空白的.当鼠标移动的时候,圆须要尾随鼠标移动.鼠标的当前位置就是圆心.我们的实现方案是:假设界面上还没有画圆,那么就新创建一个:假设已经 ...
- bind merge r 和join_R语言中的数据合并函数(merge,cbind和rbind)的使用
R语言中的数据合并函数(merge,cbind和rbind)的使用-R语言中用cbind() 和rbind() 构建分块矩阵 1.merge函数 两个数据框拥有相同的时间或观测值,但这些列却不尽相同. ...
- 程序通过定义学生结构体变量,存储学生的学号、姓名和3门课的成绩。函数fun的功能是:对形参b所指结构体变量中的数据进行修改,并在主函数中输出修改后的数据。...
程序通过定义学生结构体变量,存储学生的学号.姓名和3门课的成绩.函数fun的功能是:对形参b所指结构体变量中的数据进行修改,并在主函数中输出修改后的数据.例如,若b所指变量t中的学号.姓名和三门课的成 ...
- 【学习笔记】18、函数的其他功能
函数的其他功能 一.调用函数时参数的顺序 1.位置参数和关键字参数 注意,混合使用的时候,位置参数不能在关键字参数的后面,否则会报错. 定义时,小括号中的参数,用来接收参数用的,称之为"形参 ...
- PostgreSQL日期函数备忘
PostgreSQL日期函数备忘 http://www.postgresql.org/docs/current/static/functions-formatting.html Date/Time F ...
- C语言输出长方柱的体积,需要求3个长方柱的体积,请编写一个基于对象的程序。数据成员包括length(长)、width(宽)、 height(高)。要求用成员函数实现以下功能...
需要求3个长方柱的体积,请编写一个基于对象的程序.数据成员包括length(长).width(宽). height(高).要求用成员函数实现以下功能: (1) 由键盘分别输入3个长方柱的长.宽.高: ...
- python中count的作用_python中函数COUNT()的功能是什么
python中函数COUNT()的功能是统计字符串里某个字符出现的次数,语法为[str.count("char", start,end)],其中str为要统计的字符,star为索引 ...
- c语言中把各位上为奇数的数取出,下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在冲。 - 赏学吧...
下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在冲.高位仍在高位,低位仍在低位.例如当s中的数为87653142时,t中的数为7531. 请改正函数fun ...
最新文章
- pip 20.3 新版本发布!即将抛弃 Python 2.x
- InitializeComponent()有什么作用?
- [C#] Socket 通讯,一个简单的聊天窗口小程序
- 三招助你轻松搞定超Diao氛围
- 深入分析Volatile的实现原理
- CS144 lab4 计算机网络实验 笔记
- 虚存的用法计算机组成原理,5.5虚拟存储器计算机组成原理.pdf
- Java高级语法笔记-自定义异常类
- creo配置文件config选项详解_5年资深架构师重点聚焦:SpringBoot的配置详解+内嵌Servlet容器
- 法拉第未来:投资者声明中存在不一致之处 贾跃亭降薪
- Python SHA1算法
- 三十万,买一只基金,放着不管,五年后会怎么样?
- 湖南对口招生计算机专业试卷,湖南省2018年普通高等学校对口招生考试计算机应用类综合试卷 参考答案...
- 计算机丢失文件无法打开ae,新手AE打开工程文件提示文件丢失解决办法0001.docx...
- Redis从入门到精通
- Oracle和Mysql的区别
- 2022年度总结:反思与回顾
- 魅族手机怎么开启smart lock功能
- [wx·part]微信小程序通过positon:absolute布局解决元素浮动显示后,如何设置显示位置问题
- 企业中系统间的几种对接方式
热门文章
- 概率论中的公式解释(个人理解,非官方)- No1
- 返回零长度的数组或者集合,而不是null
- Layout 和 Menu【转】
- Android Studio .jar 包的引用方式(导入方式)
- Web前端 HTTP1.0、 HTTP 1.1 、 HTTP2.0 区别与联系
- Mac端将本地新项目上传到github
- Java 基础总结--反射的基本操作
- 常用的一些类,少走弯路。待续...
- 使用UITextField去自定义searchBar 【iOS】
- 简单几何(线段相交) POJ 2653 Pick-up sticks