文章摘要
这篇文章介绍了如何在PostgreSQL 9.5版本中实现UPDATES功能,具体分为两部分:在 PostgreSQL 9.5版本之前通过WITH UPSERT语法实现,以及在 9.5版本之后通过INSERT ON CONFLICT语法实现。 在 PostgreSQL 9.5版本之前,可以通过WITH UPSERT语法结合子查询来实现UPDATES功能。例如,可以使用WITH UPSERT子句来判断表中是否存在已存在的记录,如果存在则更新,否则插入新记录。通过这种方式,可以在一次性SQL语句中完成插入或更新操作。 在 PostgreSQL 9.5版本之后,可以直接使用INSERT ON CONFLICT语句,通过定义冲突策略(如更新、删除或忽略)来实现UPDATES功能。例如,当插入或更新记录时,如果表中已有相同键值的记录,则会根据定义的冲突策略进行处理。这种方式使得SQL语句更加简洁,操作更加高效。 总结来说,这篇文章通过实例和简要解释,展示了PostgreSQL如何在不同的版本中实现UPDATES功能,帮助读者理解并应用这些高级功能。
目录准备工作postgresql 9.5版本之前实现upsert功能postgresql 9.5版本之后实现upsert功能总结
我们只需要准备一张表

upsert是一个组合词,即当往表中插入记录,如果该记录已存在则更新,否则插入新记录。
语法
postgresql 9.5版本之前想实现upsert功能可以使用with语法来实现。
实例
SQL如下
WITH UPSERT
AS ( UPDATE org SET org_name=’复仇者联盟2′, modify_time=now() WHERE org_id=2 RETURNING *)
INSERT
INTO org (org_id, org_no, org_name)
SELECT 2,
‘002’,
‘复仇者联盟’
WHERE NOT EXISTS(SELECT 1 FROM upsert WHERE org_id=2);
AS ( UPDATE org SET org_name=’复仇者联盟2′, modify_time=now() WHERE org_id=2 RETURNING *)
INSERT
INTO org (org_id, org_no, org_name)
SELECT 2,
‘002’,
‘复仇者联盟’
WHERE NOT EXISTS(SELECT 1 FROM upsert WHERE org_id=2);
第一次执行SQL,表中没有org_id为2的数据,则插入一条新数据。

执行成功了,刷新一下表,可以看到插入了一条新数据。

再次执行SQL,这时表中已经有一条为org_id为2的数据了,那么则更新数据。

刷新表,可以看到更新了org_name和modify_time字段。

嘚吧嘚(SQL语法简解)
那么是如何做到呢?
首先执行update语句,如果找到满足条件的数据就更新,并把该数据存放到upsert中,在执行insert时就不满足条件了;如果找不到满足条件的数据,upsert中就是空的,在执行insert语句时就满足条件了。二者是互斥的。
语法
postgresql 9.5版本就可以使用INSERT ON CONFLICT语句了,语法如下:
insert into table_name(column_list)
values(value_list)
on conflict target action;
values(value_list)
on conflict target action;
实例
SQL如下:
insert into org(org_id, org_no, org_name)
values (3, ‘003’, ‘银河护卫队’)
on conflict(org_id) do update set org_name=’银河护卫队2′,
modify_time=now();
values (3, ‘003’, ‘银河护卫队’)
on conflict(org_id) do update set org_name=’银河护卫队2′,
modify_time=now();
第一次执行SQL,表中没有org_id为3的数据,则插入一条新数据。

执行成功了,刷新一下表,可以看到插入了一条新数据。

第二次执行SQL,这时表中已经有一条为org_id为3的数据了,那么则更新数据。

可以看到更新了org_name和modify_time字段。

嘚吧嘚(SQL语法简解)
其实大体思路和之前还是一样,就是9.5版本有了INSERT ON CONFLICT语句之后,使得书写SQL更加简单了,那就简单解释一下SQL语法中的两个名词吧。
可以理解为目标或者限制条件,一般是某个字段名。是要做的具体操作,比如update、delete、do nothing等。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:PostgreSQL实现批量插入、更新与合并操作的方法PostgreSQL upsert(插入更新)数据的操作详解Postgresql通过查询进行更新的操作
© 版权声明
文章版权归作者所有,未经允许请勿转载。



