mysql - 为什么oracle可以update pk=pk+1,而MySQL不能update set pk=pk+1

标签 mysql oracle primary-key

甲骨文:

 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/

相关文章:

sql - 如何使用 Oracle SQL 选择第一组连续的行

mysql - MySQL InnoDB 中的簇主键

oracle - 在oracle中执行存储过程后是否会发生任何自动提交?

sql - 行集中、周期日期

php - .php 文件未在所有浏览器中查看

php - 使用 php 将 NULL 插入 sql 查询

java - 在 URL 中向用户显示键值是否存在任何安全问题?

dataframe - 根据共享值将一列从一个数据帧添加到另一个数据帧

php - SQL 表中的多维数组

PHP - "n"列表中的 child 数量