テーブルのいくつかのフィールドのUNIQUE
制約があります。この制約のフィールドを変更したい画像(1つのフィールドを削除)。通常、私は次のようなことをします:
DROP INDEX unique_name ON table_name;
CREATE UNIQUE INDEX unique_name ON table_name (field1, field2, ...);
しかし、これらは2つのステートメントであり、最初のステートメントを実行するとUNIQUE
制約はなくなります。そのため、新しいINSERT
が作成されるまで、UNIQUE
は制約を破る可能性があります。
それを行う別の方法があります:
ALTER TABLE table_name
DROP INDEX unique_name,
ADD CONSTRAINT unique_name UNIQUE (field1, field2, ...);
これは1つのステートメントです。質問は次のとおりです。このステートメントはアトミック操作を実行しますか?アトミックとは、UNIQUE
制約がまったくない場合にtime windowがないことを意味します。
公式の ALTER TABLE
ドキュメントによると、そのような操作に問題はなく、UNIQUE
制約がまったくない場合はウィンドウがありません。 (私の強調)を参照してください:
ストレージ、パフォーマンス、および同時実行に関する考慮事項
ほとんどの場合、ALTER TABLEは元のテーブルの一時的なコピーを作成します。 MySQLは、テーブルを変更している他の操作を待機してから続行します。変更をコピーに組み込み、元のテーブルを削除して、新しいテーブルの名前を変更します。
ALTER TABLE
の実行中、元のテーブルは他のセッションで読み取ることができます(例外はすぐに注記されます)。 更新と書き込みテーブルへALTER TABLE
操作の開始後に開始される]は停止されます新しいテーブルの準備ができるまで、その後、自動的に新しいテーブルにリダイレクトされます。失敗した更新。元のテーブルの一時コピーが作成されます...
もちろん、2つのステップで操作を実行することを禁止するものはありません(ただし、これはおそらく効率が低下します)。
まず、新しいUNIQUE
制約を(別の名前で)追加します。
ALTER TABLE table_name
ADD CONSTRAINT unique_name_2
UNIQUE (field1, field2, ...) ;
古いものを削除します:
ALTER TABLE table_name
DROP INDEX unique_name ;
これにより、両方の制約がある小さなウィンドウが可能になりますが、いずれの制約もない時間はありません。