鉴于:
customer[id BIGINT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(30), count INT]
我想自动执行以下操作:更新客户(如果已经存在);否则,插入一个新客户。
从理论上讲,这听起来似乎非常适合SQL- MERGE,但是我正在使用的数据库不支持将AUTO_INCREMENT列与MERGE配合使用。
似乎表明,如果对不存在的行执行查询或更新语句,数据库将锁定索引,从而防止并发插入。
SQL标准可以保证这种行为吗?是否有任何数据库无法以这种方式运行?
更新 :对不起,我应该早先提到:解决方案必须使用READ_COMMITTED事务隔离, 除非 这是不可能的,在这种情况下,我将接受使用SERIALIZABLE。
回答我自己的问题,因为围绕该主题似乎有很多困惑。看起来:
-- BAD! DO NOT DO THIS! -- insert customer (email, count) select 'foo@example.com', 0 where not exists ( select 1 from customer where email = 'foo@example.com' )
对竞争条件开放。从我所能收集的资料来看,这个问题的唯一可移植的解决方案是:
insert
update
select