在 MySQL 中,我们可以对任何违反约束的情况执行以下操作
INSERT INTO table {setters} ON DUPLICATE KEY UPDATE {setters}
无论如何在 Postgres 中这样做?
INSERT INTO table {setters} ON CONFLICT(*) DO UPDATE {setters}
注意:* = 任何可能的键
为什么这是一个重要的功能?
- 我想让这个代码在多个表中通用。所以,我不能按照当前的 Postgres 9.5 语法指定键(有人可能会争辩,我可以将键存储在所有表上并动态更改键。首先它不优雅,并且存在以下问题)
- 当应用程序运行时,可以在运行时添加一些新的独特约束。因此,您不能在编译时在代码中指定它
- 另一种选择是:在您的应用程序中,您首先尝试插入,当出现重复键错误时,您捕获它并尝试进行更新。这真的很糟糕,因为这是
- 不是原子操作
- 应用服务器和数据库服务器之间的延迟加倍。
- 无法批量插入