oracle defered constraint

本文探讨了在数据库中更新具有唯一性约束字段时遇到的问题,并提供了几种有效的解决方案。通过使用CASE WHEN语句或者设置DEFERRABLE INITIALLY DEFERRED约束检查方式,可以在同一事务中成功更新两个值。
摘要由CSDN通过智能技术生成
今天同事遇到一个问题,发现UI可能需要交互一个有唯一性约束的column的两个值,比如叫id,一个值是1,一个是2,UI传过来的是两句update(其实是一个batch里面做的)。由于是同一个transaction,就会报错。解决办法是参考了http://www.rhinocerus.net/forum/databases-oracle-misc/327785-problem-updating-unique-values.html:

This works fine on 9i:

CREATE TABLE primes (
rank INT NOT NULL PRIMARY KEY,
prime INT NOT NULL);

INSERT INTO primes VALUES (1,3);
INSERT INTO primes VALUES (2,2);
COMMIT;

ALTER TABLE primes
ADD CONSTRAINT unique_prime
UNIQUE (prime) DEFERRABLE INITIALLY DEFERRED;

UPDATE primes SET prime = 2 WHERE rank = 1;
UPDATE primes SET prime = 3 WHERE rank = 2;
COMMIT;

Without deferrable constraint checking, this would also work:

UPDATE primes
SET prime = CASE rank WHEN 1 then 2 ELSE 3 END
WHERE rank IN (1,2);

自己去试的时候发现
UPDATE primes SET prime = 2 WHERE rank = 1;
UPDATE primes SET prime = 3 WHERE rank = 2;
COMMIT;
可以成功,但是
UPDATE primes SET prime = 2 WHERE prime = 3;
UPDATE primes SET prime = 3 WHERE prime = 2;
COMMIT;
这样发现不行,好奇怪,先mark,有空再查
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值