PostgreSQL使用函数实现merge功能

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: PostgreSQL使用函数实现merge功能http://www.bieryun.com/3263.html 实验环境 操作系统:windows 10 家庭中文版 数据库系统: PostgreSQL 9.6.2 说明 oracle数据库中有merge函数,可在插入数据前判断:如果指定列数据不存在,则正常插入数据;如果指定列数据存在,则将此条数据更新为插入的数据。

PostgreSQL使用函数实现merge功能http://www.bieryun.com/3263.html

实验环境

操作系统: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/postgres
 template1   | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres          +
             |          |          |                                |                                | postgres=CTc/postgres
 test        | 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 | 1
 2 | 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函数,比较适合在进行数据库迁移的时候配合外部表和触发器使用,而在正常业务环境中使用机会不多。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
5月前
|
自然语言处理 关系型数据库 MySQL
mysql 全文搜索功能优缺点
mysql 全文搜索功能优缺点
|
4月前
|
关系型数据库 Serverless 定位技术
PostgreSQL GIS函数判断两条线有交点的函数是什么?
PostgreSQL GIS函数判断两条线有交点的函数是什么?
326 60
|
2月前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
46 0
|
5月前
|
SQL 自然语言处理 关系型数据库
在 PostgreSQL 中使用 `REPLACE` 函数
【8月更文挑战第8天】
1071 9
在 PostgreSQL 中使用 `REPLACE` 函数
|
5月前
|
存储 关系型数据库 MySQL
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
本文介绍了一个基于Python Django框架开发的医院管理系统,该系统设计了管理员、用户和医生三个角色,具备多用户功能,并使用MySQL数据库进行数据存储和管理。
202 4
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
|
4月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
5月前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
135 3
|
5月前
|
关系型数据库 PostgreSQL
PostgreSQL的null值函数
【8月更文挑战第20天】PostgreSQL的null值函数
115 3
|
5月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
561 0
|
6月前
|
关系型数据库 MySQL 存储