MySQL 临时表与会话数据

MySQLBeginner
立即练习

介绍

在本实验中,你将学习如何在 MySQL 中使用临时表,重点关注它们在单个会话中的创建和使用。你将从连接到 MySQL 服务器开始,并创建一个名为 temp_employees 的临时表。

在整个实验过程中,你将向此表插入数据,查询它以检索信息,并通过尝试从另一个会话访问它来探索其会话特定的作用域。最后,你将学习如何显式删除临时表,并了解其自动清理过程。本实验将为你提供关于如何使用临时表进行会话特定数据操作的实践理解。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 100%。获得了学习者 95% 的好评率。

连接到 MySQL 并创建临时表

在此步骤中,你将连接到 MySQL 服务器并创建你的第一个临时表。临时表是特殊的表,仅在单个客户端会话期间存在。当会话结束时,它们会被自动删除,这使得它们对于存储中间结果或仅在短时间内需要的数据非常有用。

首先,在 LabEx VM 中打开一个终端。使用以下命令以 root 用户身份连接到 MySQL 服务器。

sudo mysql -u root

运行该命令后,你应该会看到 MySQL 提示符,它看起来像 mysql>。这表明你已成功连接到 MySQL 服务器,现在可以执行 SQL 命令了。

在创建表之前,你需要选择一个数据库。我们将使用 test 数据库,该数据库默认可用于测试。如果它不存在,以下命令将创建它。

CREATE DATABASE IF NOT EXISTS test;
USE test;

接下来,创建一个名为 temp_employees 的临时表。语法与创建常规表类似,但你必须包含 TEMPORARY 关键字。

mysql> 提示符下执行以下 SQL 命令:

CREATE TEMPORARY TABLE temp_employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255),
    department VARCHAR(255)
);

此命令创建一个具有三列的临时表:

  • id: 一个整数,用作主键,并且对于每一行都会自动递增。
  • name: 一个字符串(最多 255 个字符),用于存储员工姓名。
  • department: 一个字符串(最多 255 个字符),用于存储员工部门。

要确认临时表已在当前会话中成功创建,请使用 DESCRIBE 命令。

DESCRIBE temp_employees;

输出将显示 temp_employees 表的结构,确认其列和数据类型:

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int          | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | YES  |     | NULL    |                |
| department | varchar(255) | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

此输出确认 temp_employees 表已准备好在你的当前 MySQL 会话中使用。

在临时表中插入和查询数据

既然你已经创建了 temp_employees 表,你就可以像操作普通表一样与它进行交互了。在此步骤中,你将向其中插入数据,然后查询这些数据。

你应该仍然处于上一步的 MySQL 会话中,并且可以看到 mysql> 提示符。

让我们使用 INSERT INTO 语句向 temp_employees 表中插入几行数据。逐一执行这些命令:

INSERT INTO temp_employees (name, department) VALUES ('Alice Smith', 'Sales');
INSERT INTO temp_employees (name, department) VALUES ('Bob Johnson', 'Marketing');
INSERT INTO temp_employees (name, department) VALUES ('Charlie Brown', 'IT');

这些命令将三个员工记录添加到你的临时表中。

要查看你刚刚插入的数据,请使用 SELECT 语句。星号 (*) 是一个通配符,表示“所有列”。

SELECT * FROM temp_employees;

此命令从 temp_employees 表中检索所有列和行。输出应显示你插入的数据:

+----+---------------+------------+
| id | name          | department |
+----+---------------+------------+
|  1 | Alice Smith   | Sales      |
|  2 | Bob Johnson   | Marketing  |
|  3 | Charlie Brown | IT         |
+----+---------------+------------+
3 rows in set (0.00 sec)

你也可以使用 WHERE 子句过滤结果。例如,要仅查找 'IT' 部门的员工,请运行以下查询:

SELECT name FROM temp_employees WHERE department = 'IT';

输出将仅显示符合条件的员工姓名:

+---------------+
| name          |
+---------------+
| Charlie Brown |
+---------------+
1 row in set (0.00 sec)

这表明标准的 DML (Data Manipulation Language) 和查询操作在临时表上按预期工作。

理解临时表的范围

临时表的一个关键特性是其会话特定范围。这意味着在一个 MySQL 会话中创建的临时表在另一个会话中是不可见或不可访问的,即使两个会话都连接到同一个数据库。此步骤将演示此行为。

在第一个终端窗口中保持当前的 MySQL 会话打开。

现在,打开一个新终端窗口。你可以通过右键单击桌面背景并选择“在此处打开终端”来完成此操作。

在此新终端中,再次连接到 MySQL 服务器。这将创建一个第二个独立的会话。

sudo mysql -u root

运行该命令后,你应该会看到 MySQL 提示符,它看起来像 mysql>。这表明你已成功连接到 MySQL 服务器,现在可以执行 SQL 命令了。

接下来,选择 test 数据库。

USE test;

你现在有两个独立的终端,每个终端都有自己的 MySQL 会话。在此会话中,尝试查询你在第一个会话中创建的 temp_employees 表:

SELECT * FROM temp_employees;

你将收到一个错误消息,因为此会话不知道在另一个会话中创建的临时表。

ERROR 1146 (42S02): Table 'test.temp_employees' doesn't exist

此错误确认 temp_employees 表仅限于创建它的会话。你也可以尝试描述该表,这将导致相同的错误。

DESCRIBE temp_employees;
ERROR 1146 (42S02): Table 'test.temp_employees' doesn't exist

这种行为是临时表工作方式的基础,也是它们能够安全地存储临时数据而不干扰其他用户或进程的原因。

你现在可以关闭这个新终端窗口,然后返回到你的原始终端。

删除临时表并结束会话

临时表会在 MySQL 会话结束时自动删除。但是,你也可以使用 DROP TEMPORARY TABLE 语句显式删除它。如果你在会话结束前已不再需要该表,这是一个好习惯,因为它可以释放资源。

你应该已回到你的原始终端窗口,该窗口中 temp_employees 表存在。

要显式删除临时表,请在 mysql> 提示符下使用以下命令:

DROP TEMPORARY TABLE temp_employees;

成功删除后,你将看到“Query OK”消息。要确认表已被删除,请再次尝试查询它:

SELECT * FROM temp_employees;

你现在应该会收到“Table doesn't exist”错误,这证实了该表在此会话中不再可用。

ERROR 1146 (42S02): Table 'test.temp_employees' doesn't exist

最后,要结束你的 MySQL 会话,请输入 exit 并按 Enter。

exit

这将关闭与 MySQL 服务器的连接,并将你带回到常规终端提示符。如果你没有显式删除临时表,它将在此时被自动移除。

总结

在此实验中,你学习了在 MySQL 中使用临时表的基础知识。你成功连接到 MySQL 服务器,使用 CREATE TEMPORARY TABLE 创建了一个临时表,并使用 INSERT INTO 向其中填充了数据。然后,你通过 SELECT 查询练习了检索这些数据。

至关重要的是,你通过演示临时表对其他会话不可见,从而探索了临时表的会话特定范围。最后,你学习了如何使用 DROP TEMPORARY TABLE 显式删除临时表,并理解了它们在会话结束时会被自动清理。临时表是管理数据库工作流中会话特定数据和中间结果的宝贵工具。