Mysql / Maridb更新无效

时间:2016-06-13 03:41:45

标签: mysql mariadb

假设一个表包含

之类的数据
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还是什么?

1 个答案:

答案 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上运行它是在另一个数据库平台和其他一些模式上。这是静音。