【发布时间】:2013-05-03 17:57:21
【问题描述】:
给定:
customer[id BIGINT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(30), count INT]
我想自动执行以下操作:如果客户已经存在,则更新他;否则,插入一个新客户。
理论上这听起来很适合SQL-MERGE,但我使用的数据库不支持MERGE with AUTO_INCREMENT columns。
https://stackoverflow.com/a/1727788/14731 似乎表明如果您对不存在的行执行查询或更新语句,数据库将锁定索引从而防止并发插入。
这种行为是否受到 SQL 标准的保证?有没有这样的数据库?
更新:对不起,我应该在前面提到这一点:解决方案必须使用 READ_COMMITTED 事务隔离除非在这种情况下这是不可能的,我将接受使用 SERIALIZABLE。
【问题讨论】:
-
那么您使用的是哪个 DBMS?不,SQL 标准不能保证“不存在”的行被锁定(实际上似乎是一个很奇怪的概念)
-
查看今天早些时候的相关问题:stackoverflow.com/questions/16359900/…
-
@a_horse_with_no_name,我正在使用H2,但我正在寻找一种可移植的解决方案。所以你是说
SELECT FOR INSERT没有什么?请发布正式答案,以便我们对其发表评论。 -
H2 特定的
merge应该可以工作:merge into customer(id, email, count) key(email) values(null, 'test@acme.com', 10)。但这不适用于其他数据库。 -
@ThomasMueller,我很困惑。根据stackoverflow.com/a/6307884/14731 上的最后一条评论,您告诉我
supplying NULL when using MERGE doesn't make sense,但现在您告诉我要这样做。如果误解围绕着key()的使用,那么也许您可以更新答案的第一部分以使用它?