在创建表时可以使用 TEMPORARY
关键字。 TEMPORARY
表只在当前会话中可见,并在会话关闭时自动删除。这意味着两个不同的会话可以使用相同的临时表名,而不会相互冲突,也不会与同名的现有非 TEMPORARY
表冲突。(现有表将被隐藏,直到临时表被删除。)
InnoDB
不支持压缩临时表。当 innodb_strict_mode
启用(默认值)时,如果指定了 ROW_FORMAT=COMPRESSED
或 KEY_BLOCK_SIZE
,则 CREATE TEMPORARY TABLE
会返回错误。如果 innodb_strict_mode
禁用,则会发出警告,并且临时表将使用非压缩行格式创建。 innodb_file_per-table
选项不会影响 InnoDB
临时表的创建。
CREATE TABLE
会导致隐式提交,除非与 TEMPORARY
关键字一起使用。请参阅 第 15.3.3 节,“导致隐式提交的语句”。
TEMPORARY
表与数据库(模式)之间的关系非常松散。删除数据库不会自动删除在该数据库中创建的任何 TEMPORARY
表。
要创建临时表,您必须拥有 CREATE TEMPORARY TABLES
权限。会话创建临时表后,服务器不会对该表进行任何进一步的权限检查。创建会话可以对表执行任何操作,例如 DROP TABLE
、INSERT
、UPDATE
或 SELECT
。
此行为的一个含义是,即使当前用户没有创建临时表的权限,会话也可以操作其临时表。假设当前用户没有 CREATE TEMPORARY TABLES
权限,但能够执行一个定义器上下文存储过程,该过程使用具有 CREATE TEMPORARY TABLES
权限的用户权限执行并创建一个临时表。在过程执行期间,会话使用定义用户的权限。过程返回后,有效权限将恢复为当前用户的权限,当前用户仍然可以看到临时表并对其执行任何操作。
您不能使用 CREATE TEMPORARY TABLE ... LIKE
基于 mysql
表空间、InnoDB
系统表空间 (innodb_system
) 或一般表空间中存在的表的定义来创建空表。此类表的表空间定义包括一个 TABLESPACE
属性,该属性定义表所在的表空间,而上述表空间不支持临时表。要根据此类表的定义创建临时表,请改用以下语法
CREATE TEMPORARY TABLE new_tbl SELECT * FROM orig_tbl LIMIT 0;
在 CREATE TEMPORARY TABLE
中使用 TABLESPACE = innodb_file_per_table
和 TABLESPACE = innodb_temporary
子句的支持已过时;预计将在未来版本的 MySQL 中删除。