web-dev-qa-db-ja.com

ALTER TABLEのDROP / ADD UNIQUE制約はアトミックですか?

テーブルのいくつかのフィールドの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がないことを意味します。

4
Alexander Guz

公式の 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 ;
    

これにより、両方の制約がある小さなウィンドウが可能になりますが、いずれの制約もない時間はありません。

4
ypercubeᵀᴹ