最佳答案
这里一个非常常见的问题是如何进行upsert,这是MySQL称为INSERT ... ON DUPLICATE UPDATE
的操作,标准支持作为MERGE
操作的一部分。
考虑到PostgreSQL不直接支持它(在pg 9.5之前),你如何做到这一点?考虑以下几点:
CREATE TABLE testtable (
id integer PRIMARY KEY,
somedata text NOT NULL
);
INSERT INTO testtable (id, somedata) VALUES
(1, 'fred'),
(2, 'bob');
现在想象一下,你想要“插入”元组(2, 'Joe')
, (3, 'Alan')
,那么新的表内容将是:
(1, 'fred'),
(2, 'Joe'), -- Changed value of existing tuple
(3, 'Alan') -- Added new tuple
这就是人们在讨论upsert
时所谈论的。至关重要的是,任何方法都必须是在同一表上存在多个事务时是安全的——要么使用显式锁定,要么以其他方式防范结果的竞态条件。
这个主题在插入,重复更新PostgreSQL?上被广泛讨论,但那是关于MySQL语法的替代方案,随着时间的推移,它增加了相当多不相关的细节。我正在研究明确的答案。
这些技术对于“如果不存在就插入,否则什么都不做”也很有用。“插入…重复键忽略”。