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

 更新时间:2023年04月05日 15:20:39   作者:布丁吖  
这篇文章主要介绍了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的数据,则插入一条新数据。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

嘚吧嘚(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的数据,则插入一条新数据。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

嘚吧嘚(SQL语法简解)

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

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • postgresql中wal_level的三个参数用法说明

    postgresql中wal_level的三个参数用法说明

    这篇文章主要介绍了postgresql中wal_level的三个参数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSQL 更新JSON,JSONB字段的操作

    PostgreSQL 更新JSON,JSONB字段的操作

    这篇文章主要介绍了PostgreSQL 更新JSON,JSONB字段的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgreSQL 使用timestamp转成date格式

    postgreSQL 使用timestamp转成date格式

    这篇文章主要介绍了postgreSQL 使用timestamp转成date格式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgreSQL数据库默认用户postgres常用命令分享

    postgreSQL数据库默认用户postgres常用命令分享

    这篇文章主要介绍了postgreSQL数据库默认用户postgres常用命令分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql 查询字符串中是否包含某字符的操作

    postgresql 查询字符串中是否包含某字符的操作

    这篇文章主要介绍了postgresql 查询字符串中是否包含某字符的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL出现死锁该如何解决

    PostgreSQL出现死锁该如何解决

    昨天在对一张表执行一条update语句的时候,没有修改成功,直接终止执行,就疯狂点击执行,执行了很多次这条语句导致了表被死锁了,这篇文章主要给大家介绍了关于PostgreSQL出现死锁该如何解决的相关资料,需要的朋友可以参考下
    2022-05-05
  • postgresql 计算时间差的秒数、天数实例

    postgresql 计算时间差的秒数、天数实例

    这篇文章主要介绍了postgresql 计算时间差的秒数、天数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSQL中数据批量导入导出的错误处理

    PostgreSQL中数据批量导入导出的错误处理

    在 PostgreSQL 中进行数据的批量导入导出是常见的操作,但有时可能会遇到各种错误,下面将详细探讨可能出现的错误类型、原因及相应的解决方案,并提供具体的示例来帮助您更好地理解和处理这些问题,需要的朋友可以参考下
    2024-07-07
  • Postgresql 检查数据库主从复制进度的操作

    Postgresql 检查数据库主从复制进度的操作

    这篇文章主要介绍了Postgresql 检查数据库主从复制进度的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSQL更新表时时间戳不会自动更新的解决方法

    PostgreSQL更新表时时间戳不会自动更新的解决方法

    这篇文章主要为大家详细介绍了PostgreSQL更新表时时间戳不会自动更新的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论