摘自:https://www.cnblogs.com/cxeye/p/4380814.html
https://www.cnblogs.com/agang-php/p/5114264.html
當工作在非常大的表上時,你可能偶爾需要運行很多查詢獲得一個大量數據的小的子集,不是對整個表運行這些查詢,而是讓MySQL每次找出所需的少數記錄,將記錄選擇到一個臨時表可能更快些,然后在這些表運行查詢。
創建臨時表很容易,給正常的CREATE TABLE語句加上TEMPORARY關鍵字:
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
)
臨時表將在你連接MySQL期間存在。當你斷開時,MySQL將自動刪除表並釋放所用的空間。當然你可以在仍然連接的時候刪除表並釋放空間。
DROP TABLE tmp_table
如果在你創建名為tmp_table臨時表時名為tmp_table的表在數據庫中已經存在,臨時表將有必要屏蔽(隱藏)非臨時表tmp_table。
如果你聲明臨時表是一個HEAP表,MySQL也允許你指定在內存中創建它:
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
) TYPE = HEAP
因為HEAP表存儲在內存中,你對它運行的查詢可能比磁盤上的臨時表快些。然而,HEAP表與一般的表有些不同,且有自身的限制。詳見MySQL參考手冊。
正如前面的建議,你應該測試臨時表看看它們是否真的比對大量數據庫運行查詢快。如果數據很好地索引,臨時表可能一點不快。
1. 臨時表再斷開於mysql的連接后系統會自動刪除臨時表中的數據,但是這只限於用下面語句建立的表:
定義字段:
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
)
2)直接將查詢結果導入臨時表
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name
2. 另外mysql也允許你在內存中直接創建臨時表,因為是在內存中所有速度會很快,語法如下:
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
) TYPE = HEAP
3. 從上面的分析可以看出臨時表的數據是會被清空的,你斷開了連接就會被自動清空,但是你程序中不可能每發行一次sql就連接一次數據庫吧(如果是這樣的話,那就會出現你擔心的問題,如果不是就沒有問題),因為只有斷開數據庫連接才會被清空數據,在一個數據庫連接里面發行多次sql的話系統是不會自動清空臨時表數據的。
臨時表可能是非常有用的,在某些情況下,保持臨時數據。最重要的是應該知道的臨時表是,他們將當前的客戶(www.111cn.net)端會話終止時被刪除
當你創建臨時表的時候,你可以使用temporary關鍵字。如:
create temporary table tmp_table(name varchar(10) not null,passwd char(6) not null)
臨時表只在當前連接可見,當這個連接關閉的時候,會自動drop。這就意味着你可以在兩個不同的連接里使用相同的臨時表名,並且相互不會沖突,或者使用 已經存在的表,但不是臨時表的表名。(當這個臨時表存在的時候,存在的表被隱藏了,如果臨時表被drop,存在的表就可見了)。創建臨時表你必須有create temporary table 權限。
臨時表用完后要記得drop掉:
DROP TEMPORARY TABLE IF EXISTS sp_output_tmp;
創建臨時表
實例 下面是一個例子,使用臨時表在PHP腳本中,使用mysql_query()函數,可以使用相同的代碼。
mysql> CREATE TEMPORARY TABLE SalesSummary ( -> product_name VARCHAR(50) NOT NULL -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00 -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00 -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0 ); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO SalesSummary -> (product_name, total_sales, avg_unit_price, total_units_sold) -> VALUES -> ('cucumber', 100.25, 90, 2); mysql> SELECT * FROM SalesSummary; +--------------+-------------+----------------+------------------+ | product_name | total_sales | avg_unit_price | total_units_sold | +--------------+-------------+----------------+------------------+ | cucumber | 100.25 | 90.00 | 2 | +--------------+-------------+----------------+------------------+ 1 row in set (0.00 sec)
刪除臨時表:
默認情況下,所有的臨時表被刪除時,MySQL的數據庫連接被終止。不過要刪除他們之前就應該發出DROP TABLE命令。下面的例子為刪除一個臨時表。
mysql> CREATE TEMPORARY TABLE SalesSummary ( -> product_name VARCHAR(50) NOT NULL -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00 -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00 -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0 ); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO SalesSummary -> (product_name, total_sales, avg_unit_price, total_units_sold) -> VALUES -> ('cucumber', 100.25, 90, 2); mysql> SELECT * FROM SalesSummary; +--------------+-------------+----------------+------------------+ | product_name | total_sales | avg_unit_price | total_units_sold | +--------------+-------------+----------------+------------------+ | cucumber | 100.25 | 90.00 | 2 | +--------------+-------------+----------------+------------------+ 1 row in set (0.00 sec) mysql> DROP TABLE SalesSummary; mysql> SELECT * FROM SalesSummary; ERROR 1146: Table 'TUTORIALS.SalesSummary' doesn't exist