私は2つのテーブルがあります。MySQLテーブルを交換してauto_incrementをアトミックに変更するにはどうすればよいですか?
CREATE TABLE table_a (
id SERIAL
);
CREATE TABLE table_b (
id SERIAL
);
私はテーブルを交換し、MAX(ID)に新しいtable_aのAUTO_INCREMENTを設定したい+1 table_bのを。例えば。
SELECT @A:=MAX(id) FROM table_a;
SET @qry = CONCAT('ALTER TABLE table_b AUTO_INCREMENT =', @A+1);
PREPARE stmt FROM @qry;
EXECUTE stmt;
RENAME TABLE table_a TO table_b_tmp, table_b TO table_a, table_b_tmp TO table_a;
残念ながら、私はテーブルをロックもRENAME TABLEは、ロックされたテーブル上で動作し、暗黙的にコミットするALTER TABLEをしないようトランザクションでこれを行うことはできません。
idsの重複を避けるために私が考えることができる唯一の解決策は、auto_increment + 50を設定することですが、このプロセスが頻繁に起こっているので、私のIDには穴がたくさんありません。
アイデア?
あなたはより良いスタックオーバーフローよりもthedailywtfするために提出される可能性があります、定期的にこのようにテーブルの上にスワップしている場合、私は思います。 .. – Greg
ありがとうございますが、これは私たちのライブサイトに影響を与えずに効率的にダンプすることができない巨大なテーブルなので、それを交換する必要があります。私を信じて、私はここに到着する前にすべての可能なルートをダウンしてきました。 –
なぜこのようなテーブルをダンピングしていますか?あなたは、複製されたスレーブデータベースをセットアップし、常にauto_incrementの位置をmuckingすることでデータの整合性を損なうことなく、ダンプを取ることをお勧めします。 – zombat