MySQLでテーブルを交換するにはどうすればよいですか?


51

時々foo計算されるいくつかの統計を含むテーブルがあるとします。他のクエリで頻繁に使用されます。

だからこそ、最新の統計を計算foo_newし、計算の準備ができたらそれらを交換したいのです。

私はそれをできた

ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;

しかしfoo、テーブルがないときにクエリがこれらの2行の間にテーブルを必要とする場合はどうなりますfooか?どういうわけかロックする必要があると思います...または別の方法がありますか?

回答:


79

次の1つのコマンドを使用します。

RENAME TABLE foo TO foo_old, foo_new To foo;

これはアトミック操作です。両方のテーブルが(非常に短い時間で)ロックされるため、アクセスはの前または後に発生しますRENAME



2
これに関する問題の1つは、tableX親制約を参照している場合fooです。この名前を変更した後、それは今、参照されますfoo_oldが、参照制約事項はありませんならば foo、あなたはOKでなければなりませんが...
マルチンWasiluk

@MarcinWasiluk-のもう一つの欠点FOREIGN KEYs
リックジェームズ

2
また、RENAME TABLEは、テーブル上の既存のクエリが実行可能になるまで完了するまで待機する必要があることにも注意してください。それは問題ありませんが、RENAMEが発生するのを待っている間、他のクエリもロックアウトします!これは、データベーステーブルの深刻なロックアップを引き起こす可能性があります(私たちにとっては)。これはinnodbに適用されます!
ジョンハント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.