甲骨文:
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说
而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),并完全避免冲突。