CREATE TABLE语句创建文件
CREATE TABLE语句保留
CREATE TABLE
创建表时,原始语句(包括所有规范和表选项)由MySQL存储。该信息将保留,以便在您使用ALTER TABLE
语句更改存储引擎,排序规则或其他设置时,保留指定的原始表选项。即使两个引擎支持的行格式不同,这也使您可以在InnoDB
和MyISAM
表类型之间进行切换。
由于保留了原始语句的文本,但是由于可以静默地重新配置某些值和选项,因此活动表定义(可通过DESCRIBE
或使用进行访问SHOW TABLE STATUS
)和表创建字符串(可通过进行访问SHOW CREATE TABLE
)可能报告不同的值。
对于InnoDB
表,报告SHOW CREATE TABLE
的Create_options
列SHOW TABLE STATUS
显示表使用的实际值ROW_FORMAT
和KEY_BLOCK_SIZE
属性。在先前的MySQL版本中,报告了这些属性的原始指定值。
由CREATE TABLE创建的文件
对于InnoDB
在每个表文件表空间或常规表空间中创建的表,表数据和关联的索引存储在数据库目录中的.ibd文件中。当InnoDB
在系统表空间中创建表,表数据和索引存储在 ibdata *文件表示系统表空间。该innodb_file_per_table
选项控制默认情况下是在每表文件表空间中还是在系统表空间中创建表。该TABLESPACE
选项可用于将表放置在每表文件表空间,常规表空间或系统表空间中,而不管innodb_file_per_table
设置如何。
对于MyISAM
表,存储引擎创建数据和索引文件。因此,对于每个MyISAM
表tbl_name
,都有两个磁盘文件。
文件 | 目的 |
---|---|
tbl_name.MYD | 资料档案 |
tbl_name.MYI | 索引文件 |
备用存储引擎,介绍了每个存储引擎创建的代表表的文件。如果表名包含特殊字符,则表文件的名称包含这些字符的编码版本,如“标识符与文件名的映射”所述。
CREATE TEMPORARY TABLE语句
您可以TEMPORARY
在创建表时使用关键字。一个TEMPORARY
表仅在当前会话中可见,并且在关闭会话时会自动删除。这意味着两个不同的会话可以使用相同的临时表名称,而不会彼此冲突或与现有TEMPORARY
的具有相同名称的非表冲突。(在删除临时表之前,现有表一直处于隐藏状态。)
InnoDB
不支持压缩的临时表。当innodb_strict_mode
启用(默认值),CREATE TEMPORARY TABLE
如果返回错误ROW_FORMAT=COMPRESSED
或KEY_BLOCK_SIZE
指定的。如果innodb_strict_mode
禁用此选项,则会发出警告,并使用非压缩的行格式创建临时表。该innodb_file_per-table
选项不会影响InnoDB
临时表的创建。
CREATE TABLE
导致隐式提交,除非与TEMPORARY
关键字一起使用。请参见“START TRANSACTION,COMMIT和ROLLBACK语句”。
TEMPORARY
表与数据库(方案)的关系非常松散。删除数据库不会自动删除该数据库中TEMPORARY
创建的任何表。
要创建临时表,您必须具有CREATE TEMPORARY TABLES
特权。会话创建临时表后,服务器将不再对该表执行任何特权检查。所述创建会话可以在桌子上进行任何操作,例如DROP TABLE
,INSERT
,UPDATE
,或SELECT
。
这种行为的一个暗示是,即使当前用户没有创建临时表的权限,会话也可以操纵其临时表。假设当前用户没有CREATE TEMPORARY TABLES
特权,但是能够执行一个定义者上下文存储过程,该过程以拥有者的特权执行CREATE TEMPORARY TABLES
并创建一个临时表。在执行过程时,会话将使用定义用户的特权。该过程返回后,有效特权将还原为当前用户的特权,该用户仍可以看到临时表并对其执行任何操作。
您不能用于CREATE TEMPORY TABLE ... LIKE
基于驻留在mysql
表空间,InnoDB
系统表空间(innodb_system
)或常规表空间中的表的定义来创建空表。这种表的表空间定义包括TABLESPACE
定义表所在表空间的属性,并且上述表空间不支持临时表。要基于此类表的定义创建临时表,请改用以下语法:
注意CREATE TEMPORARY TABLE new_tblSELECT *FROM orig_tblLIMIT 0;
自MySQL 8.0.13起,不再支持TABLESPACE = innodb_file_per_table
和TABLESPACE = innodb_temporary
带有的子句,CREATE TEMPORARY TABLE
在将来的MySQL版本中将不再支持。