13.1.18.2 CREATE TEMPORARY TABLE 语句

您可以在创建 table 时使用TEMPORARY关键字。 TEMPORARYtable 仅在当前会话中可见,并且在会话关闭时会自动删除。这意味着两个不同的会话可以使用相同的临时 table 名称,而不会彼此冲突或与现有的相同名称的非TEMPORARYtable 冲突。 (在删除临时 table 之前,现有 table 一直处于隐藏状态.)

CREATE TABLE导致隐式提交,除非与TEMPORARY关键字一起使用。参见第 13.3.3 节“导致隐式提交的声明”

TEMPORARYtable 与数据库(方案)的关系非常松散。删除数据库不会自动删除该数据库中创建的任何TEMPORARYtable。另外,如果用CREATE TABLE语句中的数据库名来限制 table 名,则可以在不存在的数据库中创建TEMPORARYtable。在这种情况下,对 table 的所有后续引用都必须使用数据库名称进行限定。

要创建临时 table,您必须具有创建临时 table特权。会话创建临时 table 后,服务器将不再对该 table 执行任何特权检查。创建会话可以对 table 执行任何操作,例如DROP TABLEINSERTUPDATESELECT

这种行为的一个暗示是,即使当前用户没有创建临时 table 的权限,会话也可以操纵其临时 table。假设当前用户不具有创建临时 table特权,但是能够执行定义者上下文存储过程,该存储过程以具有创建临时 table用户的特权执行并创建一个临时 table。在执行过程时,会话将使用定义用户的特权。该过程返回后,有效特权将还原为当前用户的特权,该用户仍可以看到临时 table 并对其执行任何操作。

Note

从 MySQL 5.7.24 开始,不支持对带有创建临时 tableTABLESPACE = innodb_file_per_tableTABLESPACE = innodb_temporary子句的支持,并将在将来的 MySQL 版本中删除。