2016-06-13 48 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