加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – Postgres UPSERT对任何约束

发布时间:2020-12-13 16:08:10 所属栏目:百科 来源:网络整理
导读:在 MySQL中,我们可以在任何约束违规时执行以下操作 INSERT INTO table {setters} ON DUPLICATE KEY UPDATE {setters} 在Postgres有没有这样做呢? INSERT INTO table {setters} ON CONFLICT(*) DO UPDATE {setters} 注意:* =任何可能的密钥 为什么这是一个
在 MySQL中,我们可以在任何约束违规时执行以下操作

INSERT INTO table {setters} ON DUPLICATE KEY UPDATE {setters}

在Postgres有没有这样做呢?

INSERT INTO table {setters} ON CONFLICT(*) DO UPDATE {setters}

注意:* =任何可能的密钥

为什么这是一个重要的特征?

>我想在多个表中使这个代码通用.因此,我无法根据当前的Postgres 9.5语法指定密钥(有人可能会争辩说,我可以将密钥存储在所有表上并动态更改密钥.首先它不优雅且存在以下问题)
>当应用程序处于活动状态时,可以在运行时添加一些新的唯一约束.因此,您无法在编译时在代码中指定此内容
>另一种选择是:在您的应用程序中,您首先尝试插入,当存在重复键错误时,您会抓住它并尝试进行更新.这真的很糟糕,因为这是

>不是原子操作
>应用服务器和数据库服务器之间的延迟增加了一倍.
>无法进行批量插入

解决方法

当然. PostgreSQL 9.5+允许您以这种方式执行此操作:

MySQL查询:

INSERT INTO tablename (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

在PostgreSQL中变成:

INSERT INTO tablename (a,c) values (1,10)
ON CONFLICT (a) DO UPDATE SET c = tablename.c + 1;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读