3

new2つのテーブルとcurrent(両方ともinnodb)があると仮定しましょう。テーブルの内容をアトミックに切り捨てcurrent、テーブルの新しいコンテンツを入力する必要がありnewます。

考えられる方法:

  • テーブル名を交換しますRENAME TABLEが、両方のテーブルがすでに作成されているため、役に立ちません。
  • トランザクションを開始します。currentテーブルを切り捨てます。selectfrom ;に挿入しcurrentます。newトランザクションをコミットします-それは大丈夫ですが、このすべてのアクションをトランザクション方式で行うことは可能ですか?
  • オンザフライで3番目のテーブルを作成し、橋のように使用します

ベストプラクティスは何ですか?

UPD:これは完璧に機能すると思います:RENAME TABLE current TO xxx, new TO current; xxx TO new

4

3 に答える 3

5

単一のMySQLステートメントを使用してテーブルの名前を変更して、単一のmysqlアトミック操作として実行する必要があります。そうしないと、さまざまな名前間でテーブルを交換しているときに、プログラムがテーブルの1つにアクセスしようとするとエラーが発生する可能性があります。

ただし、操作の最後に新しいレコードを受け入れるには、「新しい」テーブルを空にする必要があるようにも思えます。

CREATE TABLE new_empty LIKE new;
RENAME TABLE current TO old, new to current, new_empty TO new;
DROP TABLE old;

これは、「現在の切り捨て」や「現在のselect * from new」を実行するよりもはるかに効率的です。これは、レコードをコピーせず、新しいテーブル構造(インデックス付き)を作成し、3つのファイルの名前を変更して削除するだけだからです。古いテーブル(データベースディレクトリから2つのファイルを削除することによる)。

https://dev.mysql.com/doc/refman/5.7/en/rename-table.html

于 2017-11-20T21:05:28.280 に答える
0

currentの名前をtempに変更してから、newをcurrentに変更し、最後にテーブルを作成して新しいテーブルを作成し、tempテーブルを削除します。

于 2013-03-20T10:47:46.087 に答える
-3

まず、現在のテーブルがロックされていないことを確認する必要があります。

2つのテーブルtable1table2がある場合

RENAME TABLE table1 TO table1_temp;
RENAME TABLE table2 TO table1;
RENAME TABLE table1_temp TO table2;

これを試して。これは間違いなくあなたを助けます。

于 2017-06-29T08:28:45.663 に答える