postgresql无则插入,有则更新问题

2023-12-04 0 317
目录
  • 准备工作
  • postgresql 9.5版本之前实现upsert功能
  • postgresql 9.5版本之后实现upsert功能
  • 总结

准备工作

我们只需要准备一张表😉

postgresql无则插入,有则更新问题

upsert是一个组合词,即当往表中插入记录,如果该记录已存在则更新,否则插入新记录。

postgresql 9.5版本之前实现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);

第一次执行SQL,表中没有org_id为2的数据,则插入一条新数据。

postgresql无则插入,有则更新问题

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

postgresql无则插入,有则更新问题

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

postgresql无则插入,有则更新问题

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

postgresql无则插入,有则更新问题

嘚吧嘚(SQL语法简解)

那么是如何做到呢?

  • 首先执行update语句,如果找到满足条件的数据就更新,并把该数据存放到upsert中,在执行insert时就不满足条件了;
  • 如果找不到满足条件的数据,upsert中就是空的,在执行insert语句时就满足条件了。二者是互斥的。

postgresql 9.5版本之后实现upsert功能

语法

postgresql 9.5版本就可以使用INSERT ON CONFLICT语句了,语法如下:

insert into table_name(column_list)
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();

第一次执行SQL,表中没有org_id为3的数据,则插入一条新数据。

postgresql无则插入,有则更新问题

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

postgresql无则插入,有则更新问题

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

postgresql无则插入,有则更新问题

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

postgresql无则插入,有则更新问题

嘚吧嘚(SQL语法简解)

其实大体思路和之前还是一样,就是9.5版本有了INSERT ON CONFLICT语句之后,使得书写SQL更加简单了,那就简单解释一下SQL语法中的两个名词吧。

  • target可以理解为目标或者限制条件,一般是某个字段名。
  • action是要做的具体操作,比如update、delete、do nothing等。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持悠久资源。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 PostgreSQL postgresql无则插入,有则更新问题 https://www.u-9.cn/database/postgresql/68870.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务