2016-06-13 3 views
0

テーブルがのMySQL/Maridb更新

MariaDB [c]> select * from t2; 
+-----+ 
| abc | 
+-----+ 
| 1 | 
| 3 | 
| 5 | 
+-----+ 

などのデータは、私の更新コマンドは、それが上記のコマンド中に次のエラーに

ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY' 

を与える

MariaDB [c]> update t2 set abc = abc+2; 

であると仮定含まれていると動作しませんOracle 10gでうまく動作します。何らかのバグですか?何ですか?

+0

これは、column.Columnにプライマリキー制約を設定すると、更新後に一意の値を持つ必要があるからです。 –

+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に違反したため、上記のエラーが発生しました。終わりの状態がすべてのことをOKにするという事実は、理想的には、それがその瞬間に失敗するのを防ぐものではありません。 (ユニーク制約に違反しないように)

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上で動作するとは、別のDBプラットフォームやその他のスキーマにあります。それはミュートです。

+0

本当に、私はjira.mariadb.comでバグを発行しましたが、これが解決されることを願っています。 –

+1

私はそれをバグとして見ません。ただ言って。 – Drew

関連する問題