MySQL临时表
简介:在本教程中,我们将讨论MySQL临时表,并向您展示如何创建,使用和删除临时表。
MySQL临时表简介
在MySQL中,临时表是一种特殊的表类型,它允许您存储临时结果集,您可以在单个会话中重复使用多次。
如果无法查询需要单个带有SELECT语句的JOIN子句的数据是不可能或不昂贵的,则临时表非常方便。
在这种情况下,您可以使用临时表存储即时结果,并使用另一个查询对其进行处理。
MySQL临时表具有以下专门功能:
通过使用CREATE TEMPORARY TABLE语句创建一个临时表。
注意,关键字TEMPORARY被添加到CREATE和TABLE关键字之间。当会话结束或连接终止时,MySQL自动删除临时表。
当然,您可以在不再使用临时表时使用DROP TABLE语句显式删除该临时表。临时表仅对创建它的客户端可用并且可以访问。
不同的客户端可以创建具有相同名称的临时表而不会导致错误,因为只有创建临时表的客户端才能看到它。
但是,在同一会话中,两个临时表不能共享相同的名称。临时表可以与数据库中的普通表具有相同的名称。
例如,如果在示例数据库中创建一个名为employees的临时表,则现有的employees表将变得不可访问。
您针对employees表发出的每个查询现在都指向临时表employees。
当您删除employees临时表时,永久employees表可用并且可访问。
即使临时表可以与永久表具有相同的名称,也不建议使用。
因为这可能导致混乱并可能导致意外的数据丢失。
例如,如果与数据库服务器的连接丢失并且您自动重新连接到服务器,则无法区分临时表和永久表。
然后,您可以发出DROP TABLE语句删除永久表而不是临时表,这是不期望的。
为避免此问题,可以使用DROP TEMPORARY TABLE语句删除临时表。
MySQL CREATE TEMPORARY TABLE语句
除了TEMPORARY关键字,CREATE TEMPORARY TABLE语句的语法与CREATE TABLE语句的语法相似:
CREATE TEMPORARY TABLE table_name( column_1_definition, column_2_definition, ..., table_constraints );
要创建结构基于现有表的临时表,不能使用CREATE TEMPORARY TABLE ... LIKE语句。
而是,使用以下语法:
CREATE TEMPORARY TABLE temp_table_name SELECT * FROM original_table LIMIT 0;
1)创建一个临时表示例
首先,创建一个名为credits的新临时表来存储客户的信用额:
CREATE TEMPORARY TABLE credits( customerNumber INT PRIMARY KEY, creditLimit DEC(10,2) );
然后,将客户表中的行插入到临时表信用中:
INSERT INTO credits(customerNumber,creditLimit) SELECT customerNumber, creditLimit FROM customers WHERE creditLimit > 0;
2)根据查询示例创建一个临时表,其结构
以下示例创建一个临时表,该表按收入存储前10名客户。
临时表的结构是从SELECT语句派生的:
CREATE TEMPORARY TABLE top_customers SELECT p.customerNumber, c.customerName, ROUND(SUM(p.amount),2) sales FROM payments p INNER JOIN customers c ON c.customerNumber = p.customerNumber GROUP BY p.customerNumber ORDER BY sales DESC LIMIT 10;
现在,您可以从top_customers临时表中查询数据,就像从永久表中查询一样:
SELECT customerNumber, customerName, sales FROM top_customers ORDER BY sales;
删除MySQL临时表
您可以使用DROP TABLE语句删除临时表,但是,按如下方式添加TEMPORARY关键字是一种好习惯:
DROP TEMPORARY TABLE table_name;
DROP TEMPORARY TABLE语句仅删除一个临时表,而不是一个永久表。
当您将临时表命名为与永久表的名称相同时,它可以帮助您避免删除永久表的错误
例如,要删除topcustomers临时表,请使用以下语句:
DROP TEMPORARY TABLE top_customers;
请注意,如果您尝试使用DROP TEMPORARY TABLE语句删除永久表,则会收到一条错误消息,提示您尝试删除的表未知。
如果开发使用连接池或持久连接的应用程序,则不能保证在终止应用程序时自动删除临时表。
因为应用程序使用的数据库连接可能仍处于打开状态,并且放置在连接池中,以便其他客户端以后再使用。
因此,一个好习惯是在不再使用临时表时始终删除它们。
检查是否存在临时表
MySQL不提供直接检查临时表是否存在的函数或语句。
但是,我们可以创建一个存储过程来检查临时表是否存在,如下所示:
DELIMITER // CREATE PROCEDURE check_table_exists(table_name VARCHAR(100)) BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @err = 1; SET @err = 0; SET @table_name = table_name; SET @sql_query = CONCAT('SELECT 1 FROM ',@table_name); PREPARE stmt1 FROM @sql_query; IF (@err = 1) THEN SET @table_exists = 0; ELSE SET @table_exists = 1; DEALLOCATE PREPARE stmt1; END IF; END // DELIMITER ;
在此过程中,我们尝试从临时表中选择数据。
如果存在临时表,则将@table_exists变量设置为1,否则将其设置为0。
该语句调用check_table_exists来检查临时表信用是否存在:
CALL check_table_exists('credits'); SELECT @table_exists;
这是输出:
在本教程中,您了解了MySQL临时表以及如何管理临时表,例如创建和删除新的临时表。