📜  MySQL临时表

📅  最后修改于: 2020-11-17 02:19:30             🧑  作者: Mango

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”表。因此,用户对学生表执行任何查询,现在将引用临时学生表。当用户删除临时表时,永久学生表可以再次访问。

创建临时表的语法

在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中创建临时表。执行以下语句,在所选数据库中创建一个临时表:

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子句合并两个表,并根据价格对它们进行排序。在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语句删除临时表。但是,将TEMPORARY关键字与DROP TABLE语句一起使用是一种好习惯。该关键字有助于我们避免在当前会话中临时表和永久表具有相同名称的情况下删除永久表的错误。建议使用以下查询删除临时表:

mysql> DROP TEMPORARY TABLE table_name;

此查询不会删除数据库的永久表,这意味着它只会删除临时表。如果我们尝试使用此语句删除永久表,它将抛出一条错误消息,提示您正在删除表是未知的。例如,如果要删除上面的临时表“ temp_customers”,则需要使用以下语句:

mysql> DROP TEMPORARY TABLE top_customers;