6

在 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. 无法批量插入
4

1 回答 1

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;
于 2016-03-04T02:14:49.993 回答