MySQL 临时表用于一些临时数据时是非常有用的
临时表只在当前连接可见,当关闭连接时,MySQL 会自动删除表并释放所有空间
因为MySQL 临时表只在当前连接可见,如果使用 PHP 脚本来创建 MySQL 临时表,那每当 PHP 脚本执行完成后,该临时表也会自动销毁
如果连接到 MySQL 使用持久性连接,那么只有在关闭客户端程序时才会销毁临时表,当然也可以手动销毁
创建临时表
命令CREATE TEMPORARY TABLE tablename 命令用来创建临时表
创建临时表的语法和 CREATE TABLE tablename 是一样的,只是多了一个 TEMPORARY 关键字
例如下面的语句用于创建一个临时表 tbl_language_temp
CREATE TEMPORARY TABLE IF NOT EXISTS tbl_language_tmp(
id INT UNSIGNED AUTO_INCREMENT,
name VARCHAR(64) NOT NULL,
url VARCHAR(128) NOT NULL,
founded_at DATE,
PRIMARY KEY ( id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
为了演示如何创建临时表和临时表的特性,我们需要打开两个终端,连接登录到 MySQL 服务,然后切换到 souyunku 数据库,我们假设两个终端的名字为 a 和 b
1、 分别在a和b终端下使用SHOWTABLES;命令查看当前数据库有多少表;
a终端
MariaDB [souyunku]> SHOW TABLES;
+----------------+
| Tables_in_souyunku |
+----------------+
| tbl_language |
+----------------+
1 row in set (0.01 sec)
b终端
MariaDB [souyunku]> SHOW TABLES;
+----------------+
| Tables_in_souyunku |
+----------------+
| tbl_language |
+----------------+
1 row in set (0.01 sec)
两个终端中的表一摸一样
如果你的和我的不一样,没关系,因为和当前数据库中有多少表一点关系都没有
2、 在a终端中运行以下语句创建临时表tbl_language_temp;
CREATE TEMPORARY TABLE IF NOT EXISTS tbl_language_tmp(
id INT UNSIGNED AUTO_INCREMENT,
name VARCHAR(64) NOT NULL,
url VARCHAR(128) NOT NULL,
founded_at DATE,
PRIMARY KEY ( id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
运行结果如下
MariaDB [souyunku]>` CREATE TEMPORARY TABLE IF NOT EXISTS tbl_language_tmp(
->` id INT UNSIGNED AUTO_INCREMENT,
->` name VARCHAR(64) NOT NULL,
->` url VARCHAR(128) NOT NULL,
->` founded_at DATE,
->` PRIMARY KEY ( id )
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.01 sec)
然后使用 SHOW TABLES; 命令查看一下当前数据中有多少表
MariaDB [souyunku]> SHOW TABLES;
+----------------+
| Tables_in_souyunku |
+----------------+
| tbl_language |
+----------------+
1 row in set (0.01 sec)
咦,没看到我们创建的临时表啊,不用着急,这是因为 SHOW TABLES; 命令是看不到表的
就是你看不到也摸不到,但是表就在那里
我们可以使用下面的语句往 tbl_language_tmp 中插入数据
INSERT INTO tbl_language_tmp (name,url,founded_at) VALUES ('Python','https://ddkk.com','1991-2-20');
运行结果如下
MariaDB [souyunku]>` INSERT INTO tbl_language_tmp (name,url,founded_at) VALUES ('Python','https://ddkk.com','1991-2-20');
Query OK, 1 row affected (0.00 sec)
可以使用 SELECT * FROM tbl_language_tmp; 查询表中的数据
MariaDB [souyunku]> SELECT * FROM tbl_language_tmp;
+----+--------+---------------------+------------+
| id | name | url | founded_at |
+----+--------+---------------------+------------+
| 1 | Python | https://ddkk.com | 1991-02-20 |
+----+--------+---------------------+------------+
1 row in set (0.00 sec)
3、 然后我们在终端b中使用SELECT*FROMtbl_language_tmp;查询表中的数据;
MariaDB [souyunku]> SELECT * FROM tbl_language_tmp;
ERROR 1146 (42S02): Table 'souyunku.tbl_language_tmp' doesn't exist
说明临时表只有创建时的连接内效用
4、 使用CTRL+C命令断开a终端中的连接,然后重新登录切换到souyunku数据库,运行SELECT*FROMtbl_language_tmp;查询表中的数据;
MariaDB [souyunku]> SELECT * FROM tbl_language_tmp;
ERROR 1146 (42S02): Table 'souyunku.tbl_language_tmp' doesn't exist
发现断开后重新再连,表已经被删除了