15.1.20.2 创建临时表语句
您可以在创建表时使用TEMPORARY
关键字。一个TEMPORARY
表只在当前会话中可见,并且在会话关闭时自动被删除。这意味着两个不同的会话可以使用同名的临时表名称,不会冲突或与存在的非TEMPORARY
表冲突(隐藏已有表直到临时表被删除)。
InnoDB
不支持压缩临时表。当innodb_strict_mode
启用(默认)时,CREATE TEMPORARY TABLE
如果指定了ROW_FORMAT=COMPRESSED
或KEY_BLOCK_SIZE
将返回错误。如果innodb_strict_mode
禁用,会发出警告,并使用非压缩行格式创建临时表。InnoDB
临时表不受innodb_file_per-table
选项影响。
CREATE TABLE
会隐式提交,除非使用 TEMPORARY
关键字。见第15.3.3节,“隐式提交语句”。
TEMPORARY
表与数据库(架构)之间关系很松散。删除一个数据库不自动删除该数据库内创建的 TEMPORARY
表。
要创建临时表,您必须拥有CREATE TEMPORARY TABLES
权限。会话创建临时表后,服务器对该表不再进行任何权限检查。创建会话可以对该表执行任何操作,如DROP TABLE
、INSERT
、UPDATE
或SELECT
。
这种行为的结果之一是,一个会话可以在当前用户没有创建临时表权限的情况下仍然操作临时表。假设当前用户不具有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的未来版本中删除。