甲骨文:

 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),并完全避免冲突。

09-03 22:52