2016-06-13 46 views
0

假设某个表包含了诸如的Mysql/Maridb更新不能正常工作

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中工作正常,是某种错误还是什么?

+0

这是因为您可能对列有主键约束。列更新后应具有唯一值。 –

+0

但完整更新后列将有独特的价值,但为什么这个工程在oracle –

回答

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违反了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上的工作,就像你在评论中所做的一样,是在另一个数据库平台和其他一些架构上。所以这是静音。

+0

谢谢男人,其实我在jira.mariadb.com发出了一个错误,并希望这将得到解决。 –

+1

我不认为它是一个错误。只是说。 – Drew