4

実際のテーブルを一時的にシャドーし、実際のテーブルと同じ名前と構造を持つ一時テーブルを作成したいと考えています。

独立して、すべての機能が期待どおりに機能します。これにより、一時テーブルが再び削除されるまで前のテーブルを非表示にする一時テーブルが作成されます。

CREATE TEMPORARY TABLE t (test INT);

これにより、元のテーブルと同じ構造 (ただし名前は異なる) の一時テーブルが作成されます。

CREATE TEMPORARY TABLE t2 LIKE t;

しかし、これはエラーになります:

CREATE TEMPORARY TABLE t LIKE t;

1066 - テーブル/エイリアスが一意ではありません: 't'

このテーブルは、元のテーブルからフェッチすると時間がかかりすぎるグループ化されたデータを保持する永続キャッシュです。このデータは、レポートの生成に使用されます。部分レポートの場合、データのサブセットから新たにキャッシュを作成したいことがあります。一時テーブルはこれに最適です。元のキャッシュを新しいデータでオーバーレイし、その上でレポート機能を実行すると、接続が終了すると自動的に削除されますが、他のすべてのプロセスは実際の永続テーブルを問題なく使用できます。

4

2 に答える 2

7

あなたがやろうとしていることを理解したので、これはあなたがやりたいことに最も近いものです:

CREATE TEMPORARY TABLE t AS SELECT * FROM t LIMIT 0;

これにより、ほぼ同じスキーマでオリジナルを「シャドウ」する一時テーブルが作成されます。引き継がれない重要なものは、キー定義、それらのキーの auto_increment プロパティ、インデックス、およびデフォルト値です。


元の回答: 作業中にテーブルの名前を変更できます。このバージョンでは、スクリプトの実行中にシャドウ テーブルが他のすべての接続に表示されることを理解してください。

CREATE TABLE target_temp LIKE target;

次に、2 つのテーブルの名前をアトミックに変更して、「一時的な」テーブルが実際のテーブルを置き換えます。

RENAME TABLE target TO target_old, target_temp TO target;

自分のことをしてください...

次に、元に戻します:

RENAME TABLE target TO target_temp, target_old TO target;
DROP TABLE target_temp;
于 2013-08-26T03:00:50.277 に答える