2013-08-26 61 views
1

我想創建一個臨時表,它將臨時映射一個真正的表並且與真實表具有相同的名稱和結構。創建一個像常規表一樣的臨時表

獨立地所有功能都按預期工作。這將創建直到暫時的再次下降,它隱藏在上表中的臨時表:

CREATE TEMPORARY TABLE t (test INT); 

這將創建具有相同結構的臨時表(但不同的名稱)作爲原:

CREATE TEMPORARY TABLE t2 LIKE t; 

但是,這給出了一個錯誤:

CREATE TEMPORARY TABLE t LIKE t; 

1066 - Not unique table/alias: 't'

該表是一個持久的CACH e保存分組數據,從原始表中提取時會花費太長時間。這些數據用於生成報告。有時,對於部分報告,我想從數據的一個子集中新建緩存。臨時表非常適合這樣做,因爲我可以使用新數據覆蓋原始緩存,在其上運行報告功能,並在連接結束時自動刪除它,而所有其他進程可以愉快地使用真正的持久表。

+0

你這是什麼MEA ñ「暫時影響真正的桌子」? –

+0

正如我所說:它「隱藏了前面的表格,直到臨時表格被再次丟棄」。 – AndreKR

+0

改進回答@AndreKR –

回答

4

現在我明白你想要做什麼,這是最接近我可以來這樣做你想要什麼:

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

這將創建一個臨時表將「陰影」原來有幾乎是相同的模式。不能傳遞的關鍵是任何關鍵定義,這些關鍵字上的auto_increment屬性,索引和默認值。


原始回答: 您可以在工作時重命名錶格。理解認爲,在這個版本中,而腳本運行您的陰影表將是所有其它連接可見:

CREATE TABLE target_temp LIKE target; 

然後原子重命名這兩個表,因此,「臨時」表代替了真實的:

RENAME TABLE target TO target_old, target_temp TO target; 

做你的事......

然後,撤消:

RENAME TABLE target TO target_temp, target_old TO target; 
DROP TABLE target_temp; 
+0

我爲這個問題添加了一個解釋。 – AndreKR

0

我不完全明白你想要做什麼。但我認爲你可以做一個重命名,然後創建和重命名另:

rename table t to t_hide; 

create table t like t_hide; 

. . . 

drop table t; 

rename table t_hide t; 

我不認爲有一個內置的方式做到這一點。你可以開一個交易。對t進行更改,然後回滾事務以防止更改通過。這可能也是你想要的。

編輯:

另一種解決辦法是把原始表到名爲t圖。所以,一週時間你會做:

rename table t to t_real; 

create view t as select * from t_real; 

然後,你可以這樣做:

create table t_fake like t_real; 

alter view t as select * from t_fake; 

alter view應在意義上的「瞬間」,它不會影響任何其他交易(將有在它之前是一個明確定義的「之前」和「之後」)。

+0

該表是MyISAM。我試過'CREATE TEMPORARY TABLE t2 LIKE t; RENAME TABLE t2 to t;'但它告訴我'表't'已經存在'。重命名原始表將破壞所有訪問't'的查詢,直到創建臨時表。 – AndreKR

+0

@AndreKR。 。 。重命名現有的表應該是一個非常快的操作。我認爲你也可以在發生時鎖定表格(雖然在重命名時我沒有鎖定表格)。 –

+0

鎖不「跟着」重命名?就像當我鎖定t然後'RENAME TABLE t TO t2'時,我認爲t2被鎖定,而不是「任何未來的表格被稱爲t」。 – AndreKR

相關問題