MySQL 临时表

MySQL 有一个特性可以创建一个叫做临时表的特殊表,它允许我们保存临时数据。我们可以在特定会话中多次重复使用此表。它在 MySQL 中可供3.23及更高版本的用户使用,因此如果我们使用旧版本,则无法使用此表。此表仅对当前会话可见和可访问。只要当前会话关闭或用户终止连接,MySQL 就会自动删除此表。当用户不打算使用该表时,我们还可以使用DROP TABLE命令显式删除该表。

如果我们使用PHP脚本运行代码,只要脚本完成执行,该表就会自动删除。如果用户通过 MySQL 客户端与服务器连接,则该表将一直存在,直到用户关闭 MySQL 客户端程序或终止连接或手动删除该表。

临时表提供了一个非常有用且灵活的特性,可以让我们快速完成复杂的任务,例如当我们查询需要带有JOIN子句的单个SELECT 语句的数据时。在这里,用户可以使用此表来保留输出并执行另一个查询来处理它。

MySQL中的临时表有很多特性,如下所示:

  • MySQL 使用 CREATE TEMPORARY TABLE 语句来创建临时表。
  • 该语句只能在 MySQL 服务器具有 CREATE TEMPORARY TABLES 权限时使用。
  • 创建它的客户端可以看到和访问它,这意味着两个不同的客户端可以使用具有相同名称的临时表而不会相互冲突。这是因为该表只能由创建它的客户看到。因此,用户不能在同一会话中创建两个具有相同名称的临时表。
  • 当用户关闭会话或手动终止连接时,MySQL 中的临时表将自动删除。
  • 用户可以创建与数据库中的普通表同名的临时表。例如,如果用户创建了一个名为 student 的临时表,则无法访问现有的 student 表。因此,用户对学生表执行任何查询,现在将引用临时student表。当用户删除临时表时,永久student将再次变得可访问。

一、创建临时表的语法

在 MySQL 中,创建临时表的语法与创建普通表语句的语法相同,但 TEMPORARY 关键字除外。让我们看看以下创建临时表的语句: 

mysql> CREATE TEMPORARY TABLE table_name (  
   column_1, column_2, ..., table_constraints  
);  

如果用户要创建一个与数据库中已有表结构相同的临时表,则不能使用上述语句。相反,我们使用如下给出的语法:

mysql> CREATE TEMPORARY TABLE temporary_table_name SELECT * FROM original_table_name LIMIT 0;  

二、创建临时表的示例

让我们了解如何在 MySQL 中创建临时表。执行以下语句,在选定的数据库中创建一个临时表:

mysql> CREATE TEMPORARY TABLE Students( student_name VARCHAR(40) NOT NULL, total_marks DECIMAL(12,2) NOT NULL DEFAULT 0.00, total_subjects INT UNSIGNED NOT NULL DEFAULT 0);

我们可以看到下图:

接下来,我们需要在临时表中插入值:

mysql>INSERT INTO Students(student_name, total_marks, total_subjects) VALUES ('Joseph', 150.75, 2), ('Peter', 180.75, 2);  

执行上述语句后,将给出以下输出:

现在,运行以下查询以获取结果:

mysql> SELECT * FROM Students;  

上述语句成功执行后,我们会得到如下输出:

需要注意的是,当我们运行SHOW TABLES命令,那么我们的临时表将不会显示在列表中。另外,如果我们关闭当前会话,然后执行 SELECT 语句,我们会收到一条消息,说数据库中没有可用的数据,甚至临时表也不存在。

三、基于普通表 创建临时表

在此示例中,我们将创建一个临时表,其结构基于数据库中已有的表。

假设我们的数据库具有永久的下表:

在这里,使用 SELECT 语句创建临时表的结构,并使用 INNER JOIN 子句合并两个表并根据price价格对它们进行排序。在 MySQL 提示符中写入以下语句:

CREATE TEMPORARY TABLE temp_customers  
SELECT c.cust_name, c.city, o.prod_name, o.price   
FROM orders o  
INNER JOIN customer c ON c.cust_id = o.order_id  
ORDER BY o.price DESC;  

当我们执行上面的语句时,我们会得到如下信息:

现在,运行以下命令来查看临时表:

mysql> SELECT * FROM temp_customers;  

我们还可以从上述临时表“ temp_customers ”中执行查询,类似于从永久表中查询数据。以下查询更清楚地解释了它:

mysql> SELECT cust_name, prod_name, price FROM temp_customers;  

执行上述语句后,将给出如下输出:

注意:需要注意的是,我们可以使用 IF NOT EXISTS 关键字来避免“表已存在”错误。

四、如何在 MySQL 中删除临时表

MySQL 允许我们使用DROP TABLE删除临时表。但是,在 DROP TABLE 语句中使用TEMPORARY关键字是一个很好的做法。这个关键字有助于我们避免在当前会话中临时表和永久表同名时删除永久表的错误。所以,它建议使用以下查询来删除临时表:

mysql>  DROP TEMPORARY TABLE  table_name;    

此SQL不会删除数据库的永久表,这意味着它只会删除临时表。如果我们试图用这个语句删除一个永久表,它会抛出一个错误消息,说你正在删除一个未知的表。例如,如果我们要删除上面的临时表“temp_customers”,我们需要使用以下语句:

mysql>  DROP TEMPORARY TABLE  top_customers;    

 

热门文章

优秀文章