web-dev-qa-db-ja.com

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

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

だから、私はfoo_newでより最近の統計を計算し、計算の準備ができたらそれらを交換したいと思います。

私はそれをできた

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

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

53
Ben

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

RENAME TABLE foo TO foo_old, foo_new To foo;

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

87
Shlomi Noach