Postgres UPSERT对任何约束

时间:2016-03-04 01:26:34

标签: postgresql constraints upsert postgresql-9.5

在MySQL中,我们可以对任何约束违规执行以下操作

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

在Postgres有没有这样做?

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

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

为什么这是一个重要的功能?

  • 我想在多个表中使这个代码通用。所以,我不能按照当前的Postgres 9.5语法指定密钥(有人可能会争辩说,我可以将密钥存储在所有表上并动态更改密钥。首先它不优雅,并且存在以下问题)
  • 当应用程序处于活动状态时,可以在运行时添加一些新的唯一约束。因此,您无法在编译时在代码中指定此内容
  • 另一种选择是:在您的应用中,您首先尝试插入,当出现重复键错误时,您会抓住它并尝试进行更新。这真的很糟糕,因为这是
    1. 不是原子操作
    2. 应用服务器和数据库服务器之间的延迟时间加倍。
    3. 无法批量插入

1 个答案:

答案 0 :(得分:1)

不确定。 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, b, c) values (1, 2, 10)
ON CONFLICT (a) DO UPDATE SET c = tablename.c + 1;