甲骨文:
create table t7(c1 number primary key,c2 number);
insert into t7 values (1,3);
insert into t7 values (2,4);
commit;
update t7 set c1=c1+1;
commit ;
select * from t7;
MySQL:
create table t7(c1 int primary key,c2 int);
insert into t7 values (1,3);
insert into t7 values (2,4);
select * from t7;
update t7 set c1=c1+1;
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
为什么MySQL说
update set pk=pk+1 :Duplicate entry '2' for key 'PRIMARY'
,
而 ORACLE 可以做到这一点 update set pk=pk+1
?
最佳答案
看来 oracle 要么在执行顺序上更聪明,要么只在将更新应用到所有行后才检查约束。无论如何,可以通过指定更新顺序来修复 mysql 示例。
create table t7(c1 int primary key,c2 int);
insert into t7 values (1,3);
insert into t7 values (2,4);
select * from t7;
update t7 set c1=c1+1 order by c1 desc;
参见 http://sqlfiddle.com/#!9/8611f4/1
尝试将第一行更新为 (2,3) 是一个重复键,因为 (2,4) 仍然具有旧值。此行为的解决方法是反转顺序并从最大索引开始,更改 (2,4) -> (3,4) 然后 (1,3) -> (2,3),并完全避免冲突.
关于mysql - 为什么oracle可以update pk=pk+1,而MySQL不能update set pk=pk+1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45806685/