假设一个表包含
之类的数据MariaDB [c]> select * from t2;
+-----+
| abc |
+-----+
| 1 |
| 3 |
| 5 |
+-----+
假设我的更新命令是
MariaDB [c]> update t2 set abc = abc+2;
出现以下错误
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'
虽然上面的命令在oracle 10g中运行正常,但它是某种bug还是什么?
答案 0 :(得分:1)
以下只是一个例子而且微不足道。
create table t2
( id int auto_increment primary key,
abc int not null,
unique key(abc)
);
insert t2(abc) values (1),(3),(5); -- 3 rows added
update t2 set abc = abc+2; -- Error Code 1062: Duplicate entry '3' for key 'abc'
发生上述错误是因为更新按主键顺序进行,也是物理排序,更改1到3违反了通过unique key
已经存在的3。理想情况下,最终状态会使每件事情都处于正常状态,这一事实并不会使其在那一刻失败。
为了说明在这个高度操纵的例子中工作,知道没有其他数据:
truncate table t2; -- the data wasn't modified but for the paranoid, clear and re-insert
insert t2(abc) values (1),(3),(5); -- 3 rows added
自下而上(以便不违反唯一约束):
update t2 set abc = abc+2 order by abc desc;
select * from t2;
+----+-----+
| id | abc |
+----+-----+
| 1 | 3 |
| 2 | 5 |
| 3 | 7 |
+----+-----+
它利用了在更新语句中拥有order by
的能力。
因此,它归结为了解您的数据以及您可以获得的内容。像在评论中所说的那样在Oracle上运行它是在另一个数据库平台和其他一些模式上。这是静音。