テーブルを新しいスキーマに移行するときに、コピーと名前の変更手順を使用してアトミックスイッチを新しいテーブルに確実に作成したいと考えています。したがって、私はこのようなロックされたテーブルの名前を変更しようとしています:ロックされたテーブルの名前を変更する
CREATE TABLE foo_new (...)
-- copy data to new table, might take very long
INSERT INTO foo_new (id,created_at,modified_at)
SELECT * FROM foo WHERE id <= 3;
LOCK TABLES foo WRITE, foo_new WRITE;
-- quickly copy the tiny rest over
INSERT INTO foo_new (id,created_at,modified_at)
SELECT * FROM foo WHERE id > 3;
-- now switch to the new table
RENAME TABLE foo TO foo_old, foo_new TO foo;
UNLOCK TABLES;
残念ながらそれはERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction
になります。
これはどうやって別の方法で行うべきですか?
これはmariadb:10.1
です。
現在の方法で間違っていたとあなたの答えでdfferenceは何でしょうか? – Martin
違いは、テーブルがロックされているときには不可能な 'RENAME TABLE'を使う必要がないということです(質問のエラーメッセージを見てください)。 – fancyPants
もう一つのテーブルが別のスキーマを持っているので、私は 'rename table'を使う必要があります。なぜ 'delete'なのかも分かりません。 – tcurdt