以下は、単なる例示であり、簡単なものです。
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プラットフォームやその他のスキーマにあります。それはミュートです。
これは、column.Columnにプライマリキー制約を設定すると、更新後に一意の値を持つ必要があるからです。 –
しかし完全更新後のカラムにはユニークな値がありますが、これはなぜoracleで動作するのですか –