今天在項目中遇到一個,當mysql的in語句中數據量很大時,建立一個臨時表的例子。於是樓主整理了一下關於臨時表的知識,與大家分享一下~
首先,臨時表只在當前連接可見,當關閉連接時,Mysql會自動刪除表並釋放所有空間。因此在不同的連接中可以創建同名的臨時表,並且操作屬於本連接的臨時表。
建立臨時表:
CREATE TEMPORARY TABLE temp_table (
id VARCHAR(32) NOT NULL,
NAME VARCHAR(100)
) ENGINE = MEMORY
注意最后面的ENGINE = MEMORY,其中ENGINE是數據庫搜索引擎,常用的幾種類型為MyISAM, MEMORY, InnoDB
1)MyISAM 管理非事物表。提供高速存儲和檢索,以及全文搜索能力
2)MEMORY存儲引擎提供“內存中”表。就像MyISAM一樣,MEMORY和MERGE存儲引擎處理非事務表
注釋:MEMORY存儲引擎正式地被確定為HEAP引擎。
3)InnoDB和存儲引擎提供事務安全表。這是默認的數據庫表存儲引擎
當然還有一種簡單粗暴的方式建立臨時表,直接將查詢結果導入到臨時表:
CREATE TEMPORARY TABLE temp_table
ENGINE = MEMORY
SELECT * FROM `bm_sc_settlement`
創建臨時表后,我們插入數據
INSERT INTO temp_table VALUES('1', 'a');
INSERT INTO temp_table VALUES('2', 'b');
INSERT INTO temp_table VALUES('3', 'c');
INSERT INTO temp_table VALUES('4', 'd');
INSERT INTO temp_table VALUES('5', 'e');
查詢:
SELECT * FROM temp_table;
可以看到我們插入的結果已經放到臨時表中(也可以做更新及刪除操作)
此時當我們關掉mysql客戶端(樓主用的SQLyog),然后重新打開。執行查詢臨時表操作,會提示找不到該臨時表
刪除臨時表:
DROP TEMPORARY TABLE IF EXISTS temp_table;
臨時表使用有一些限制條件:
1)在同一個query語句中,相同的臨時表只能出現一次。如:
SELECT * FROM temp_table a ,temp_table b;
錯誤信息:ERROR 1137 (HY000): Can't reopen table: 'temp_table'
同樣相同臨時表不能在存儲函數中出現多次,如果在一個存儲函數里,用不同的別名查找一個臨時表多次,或者在這個存儲函數里用不同的語句查找,都會出現這個錯誤。
2) 不同的臨時表可以出現在同一個query語句中,如臨時表temp_tb1, temp_tb2:
select * from temp_tb1, temp_tb2;
3)可以復制臨時表得到一個新的臨時表,如:
create temporary table new_table select * from old_table;