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功能相关推荐

  1. PostgreSQL常用函数以及操作符

    一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是PostgreSQL中提供的比较操作符列表: 操作符 描述 < ...

  2. PostgreSQL之函数和操作符

    一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是PostgreSQL中提供的比较操作符列表: 操作符 描述 < ...

  3. 让你的javascript函数拥有记忆功能,降低全局变量的使用

    考虑例如以下场景:假如我们须要在界面上画一个圆,初始的时候界面是空白的.当鼠标移动的时候,圆须要尾随鼠标移动.鼠标的当前位置就是圆心.我们的实现方案是:假设界面上还没有画圆,那么就新创建一个:假设已经 ...

  4. bind merge r 和join_R语言中的数据合并函数(merge,cbind和rbind)的使用

    R语言中的数据合并函数(merge,cbind和rbind)的使用-R语言中用cbind() 和rbind() 构建分块矩阵 1.merge函数 两个数据框拥有相同的时间或观测值,但这些列却不尽相同. ...

  5. 程序通过定义学生结构体变量,存储学生的学号、姓名和3门课的成绩。函数fun的功能是:对形参b所指结构体变量中的数据进行修改,并在主函数中输出修改后的数据。...

    程序通过定义学生结构体变量,存储学生的学号.姓名和3门课的成绩.函数fun的功能是:对形参b所指结构体变量中的数据进行修改,并在主函数中输出修改后的数据.例如,若b所指变量t中的学号.姓名和三门课的成 ...

  6. 【学习笔记】18、函数的其他功能

    函数的其他功能 一.调用函数时参数的顺序 1.位置参数和关键字参数 注意,混合使用的时候,位置参数不能在关键字参数的后面,否则会报错. 定义时,小括号中的参数,用来接收参数用的,称之为"形参 ...

  7. PostgreSQL日期函数备忘

    PostgreSQL日期函数备忘 http://www.postgresql.org/docs/current/static/functions-formatting.html Date/Time F ...

  8. C语言输出长方柱的体积,需要求3个长方柱的体积,请编写一个基于对象的程序。数据成员包括length(长)、width(宽)、 height(高)。要求用成员函数实现以下功能...

    需要求3个长方柱的体积,请编写一个基于对象的程序.数据成员包括length(长).width(宽). height(高).要求用成员函数实现以下功能: (1) 由键盘分别输入3个长方柱的长.宽.高: ...

  9. python中count的作用_python中函数COUNT()的功能是什么

    python中函数COUNT()的功能是统计字符串里某个字符出现的次数,语法为[str.count("char", start,end)],其中str为要统计的字符,star为索引 ...

  10. c语言中把各位上为奇数的数取出,下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在冲。 - 赏学吧...

    下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在冲.高位仍在高位,低位仍在低位.例如当s中的数为87653142时,t中的数为7531. 请改正函数fun ...

最新文章

  1. pip 20.3 新版本发布!即将抛弃 Python 2.x
  2. InitializeComponent()有什么作用?
  3. [C#] Socket 通讯,一个简单的聊天窗口小程序
  4. 三招助你轻松搞定超Diao氛围
  5. 深入分析Volatile的实现原理
  6. CS144 lab4 计算机网络实验 笔记
  7. 虚存的用法计算机组成原理,5.5虚拟存储器计算机组成原理.pdf
  8. Java高级语法笔记-自定义异常类
  9. creo配置文件config选项详解_5年资深架构师重点聚焦:SpringBoot的配置详解+内嵌Servlet容器
  10. 法拉第未来:投资者声明中存在不一致之处 贾跃亭降薪
  11. Python SHA1算法
  12. 三十万,买一只基金,放着不管,五年后会怎么样?
  13. 湖南对口招生计算机专业试卷,湖南省2018年普通高等学校对口招生考试计算机应用类综合试卷 参考答案...
  14. 计算机丢失文件无法打开ae,新手AE打开工程文件提示文件丢失解决办法0001.docx...
  15. Redis从入门到精通
  16. Oracle和Mysql的区别
  17. 2022年度总结:反思与回顾
  18. 魅族手机怎么开启smart lock功能
  19. [wx·part]微信小程序通过positon:absolute布局解决元素浮动显示后,如何设置显示位置问题
  20. 企业中系统间的几种对接方式

热门文章

  1. 概率论中的公式解释(个人理解,非官方)- No1
  2. 返回零长度的数组或者集合,而不是null
  3. Layout 和 Menu【转】
  4. Android Studio .jar 包的引用方式(导入方式)
  5. Web前端 HTTP1.0、 HTTP 1.1 、 HTTP2.0 区别与联系
  6. Mac端将本地新项目上传到github
  7. Java 基础总结--反射的基本操作
  8. 常用的一些类,少走弯路。待续...
  9. 使用UITextField去自定义searchBar 【iOS】
  10. 简单几何(线段相交) POJ 2653 Pick-up sticks