CREATE TABLE

CREATE TABLE 语句用于在当前所选数据库中创建新表。另可参阅单独的 CREATE TABLE LIKE 文档。

语法图

CreateTableStmt:

CreateTableStmt

IfNotExists:

IfNotExists

TableName:

TableName

TableElementListOpt:

TableElementListOpt

TableElement:

TableElement

PartitionOpt:

PartitionOpt

ColumnDef:

ColumnDef

ColumnName:

ColumnName

Type:

Type

ColumnOptionListOpt:

ColumnOptionListOpt

TableOptionListOpt:

TableOptionListOpt

语法说明

CREATE TABLE 用于创建一个表。目前不支持临时表,不支持 CHECK 约束,不支持创建表的同时从其它表导入数据功能。在语法上也支持一些 Partition_options,但是并不完全,就不做列举了。

以下是 CREATE TABLE 相关的语法说明:

  1. CREATE TABLE [IF NOT EXISTS] tbl_name
  2. (create_definition,...)
  3. [table_options]

使用 IF NOT EXIST 时,即使创建的表已经存在,也不会报错,如果不指定时,则报错。

  1. CREATE TABLE [IF NOT EXISTS] tbl_name
  2. { LIKE old_tbl_name | (LIKE old_tbl_name) }

使用 LIKE 基于一个表的定义创建一个空表,包括这个表中的列属性和索引属性。

  1. create_definition:
  2. col_name column_definition
  3. | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
  4. [index_option] ...
  5. | {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
  6. [index_option] ...
  7. | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
  8. [index_name] [index_type] (index_col_name,...)
  9. [index_option] ...
  10. | {FULLTEXT} [INDEX|KEY] [index_name] (index_col_name,...)
  11. [index_option] ...
  12. | [CONSTRAINT [symbol]] FOREIGN KEY
  13. [index_name] (index_col_name,...) reference_definition

create_definitionFULLTEXTFOREIGN KEY 目前只是语法上支持。

  1. column_definition:
  2. data_type [NOT NULL | NULL] [DEFAULT default_value]
  3. [AUTO_INCREMENT | AUTO_RANDOM [(length)]]
  4. [UNIQUE [KEY] | [PRIMARY] KEY]
  5. [COMMENT 'string']
  6. [reference_definition]
  7. | data_type [GENERATED ALWAYS] AS (expression)
  8. [VIRTUAL | STORED] [UNIQUE [KEY]] [COMMENT comment]
  9. [NOT NULL | NULL] [[PRIMARY] KEY]
  10. data_type:
  11. BIT[(length)]
  12. | TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  13. | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  14. | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  15. | INT[(length)] [UNSIGNED] [ZEROFILL]
  16. | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  17. | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  18. | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  19. | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  20. | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  21. | DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
  22. | NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
  23. | DATE
  24. | TIME[(fsp)]
  25. | TIMESTAMP[(fsp)]
  26. | DATETIME[(fsp)]
  27. | YEAR
  28. | CHAR[(length)] [BINARY]
  29. [CHARACTER SET charset_name] [COLLATE collation_name]
  30. | VARCHAR(length) [BINARY]
  31. [CHARACTER SET charset_name] [COLLATE collation_name]
  32. | BINARY[(length)]
  33. | VARBINARY(length)
  34. | TINYBLOB
  35. | BLOB
  36. | MEDIUMBLOB
  37. | LONGBLOB
  38. | TINYTEXT [BINARY]
  39. [CHARACTER SET charset_name] [COLLATE collation_name]
  40. | TEXT [BINARY]
  41. [CHARACTER SET charset_name] [COLLATE collation_name]
  42. | MEDIUMTEXT [BINARY]
  43. [CHARACTER SET charset_name] [COLLATE collation_name]
  44. | LONGTEXT [BINARY]
  45. [CHARACTER SET charset_name] [COLLATE collation_name]
  46. | ENUM(value1,value2,value3,...)
  47. [CHARACTER SET charset_name] [COLLATE collation_name]
  48. | SET(value1,value2,value3,...)
  49. [CHARACTER SET charset_name] [COLLATE collation_name]
  50. | JSON

data_type 请参考数据类型章节。

  1. index_col_name:
  2. col_name [(length)] [ASC | DESC]

index_col_name[ASC | DESC] 目前只是语法上支持。

  1. index_type:
  2. USING {BTREE | HASH}

index_type 目前只是语法上支持。

  1. index_option:
  2. KEY_BLOCK_SIZE [=] value
  3. | index_type
  4. | COMMENT 'string'

index_optionKEY_BLOCK_SIZE 目前只是语法上支持。

  1. reference_definition:
  2. REFERENCES tbl_name (index_col_name,...)
  3. [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
  4. [ON DELETE reference_option]
  5. [ON UPDATE reference_option]
  6. reference_option:
  7. RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
  1. table_options:
  2. table_option [[,] table_option] ...
  3. table_option:
  4. AUTO_INCREMENT [=] value
  5. | AVG_ROW_LENGTH [=] value
  6. | SHARD_ROW_ID_BITS [=] value
  7. | PRE_SPLIT_REGIONS [=] value
  8. | [DEFAULT] CHARACTER SET [=] charset_name
  9. | CHECKSUM [=] {0 | 1}
  10. | [DEFAULT] COLLATE [=] collation_name
  11. | COMMENT [=] 'string'
  12. | COMPRESSION [=] {'ZLIB'|'LZ4'|'NONE'}
  13. | CONNECTION [=] 'connect_string'
  14. | DELAY_KEY_WRITE [=] {0 | 1}
  15. | ENGINE [=] engine_name
  16. | KEY_BLOCK_SIZE [=] value
  17. | MAX_ROWS [=] value
  18. | MIN_ROWS [=] value
  19. | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
  20. | STATS_PERSISTENT [=] {DEFAULT|0|1}

table_option 目前支持的只有 AUTO_INCREMENTSHARD_ROW_ID_BITS(详情介绍请参考 TiDB 专用系统变量和语法)、PRE_SPLIT_REGIONSCHARACTER SETCOLLATECOMMENT,其它只是语法上支持。具体内容参考下表,各个子句之间用逗号隔开。

参数 含义 举例
AUTO_INCREMENT 自增字段初始值 AUTO_INCREMENT = 5
SHARD_ROW_ID_BITS 用来设置隐式 _tidb_rowid 的分片数量的 bit 位数 SHARD_ROW_ID_BITS = 4
PRE_SPLIT_REGIONS 用来在建表时预先均匀切分 2^(PRE_SPLIT_REGIONS) 个 Region PRE_SPLIT_REGIONS = 4
CHARACTER SET 指定该表所使用的字符集 CHARACTER SET = ‘utf8mb4’
COLLATE 指定该表所使用的字符集排序规则 COLLATE = ‘utf8mb4_bin’
COMMENT 注释信息 COMMENT = ‘comment info’

split-table 配置项默认情况下会开启,在此配置项开启时,建表操作会为每个表建立单独的 Region。

示例

  1. CREATE TABLE t1 (a int);
  1. Query OK, 0 rows affected (0.11 sec)
  1. CREATE TABLE t2 LIKE t1;
  1. Query OK, 0 rows affected (0.10 sec)
  1. DESC t1;
  1. +-------+---------+------+------+---------+-------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +-------+---------+------+------+---------+-------+
  4. | a | int(11) | YES | | NULL | |
  5. +-------+---------+------+------+---------+-------+
  6. 1 row in set (0.00 sec)
  1. INSERT INTO t1 VALUES (1);
  1. Query OK, 1 row affected (0.02 sec)
  1. SELECT * FROM t1;
  1. +------+
  2. | a |
  3. +------+
  4. | 1 |
  5. +------+
  6. 1 row in set (0.00 sec)

MySQL 兼容性

  • TiDB 不支持 CREATE TEMPORARY TABLE 语法。
  • 支持除空间类型以外的所有数据类型。
  • 不支持 FULLTEXTHASHSPATIAL 索引。
  • KEY_BLOCK_SIZEENGINE 属性可被解析,但会被忽略。
  • index_col_name 属性支持 length 选项,最大长度限制为 3072 字节。此长度限制不会更改,具体取决于存储引擎和建表时使用的字符集。
  • index_col_name 属性支持 ASCDESC 的索引排序选项。
  • COMMENT 属性最多支持 1024 个字符,不支持 WITH PARSER 选项。
  • TiDB 在单个表中最多支持 512 列。InnoDB 中相应的数量限制为 1017,MySQL 中的硬限制为 4096。

另请参阅