CREATE TABLE

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

语法图

CreateTableStmt

CREATE TABLE - 图1

OptTemporary

CREATE TABLE - 图2

IfNotExists

CREATE TABLE - 图3

TableName

CREATE TABLE - 图4

TableElementListOpt

CREATE TABLE - 图5

TableElementList

CREATE TABLE - 图6

TableElement

CREATE TABLE - 图7

ColumnDef

CREATE TABLE - 图8

ColumnOptionListOpt

CREATE TABLE - 图9

ColumnOptionList

CREATE TABLE - 图10

ColumnOption

CREATE TABLE - 图11

Constraint

CREATE TABLE - 图12

IndexDef

CREATE TABLE - 图13

KeyPartList

CREATE TABLE - 图14

KeyPart

CREATE TABLE - 图15

IndexOption

CREATE TABLE - 图16

ForeignKeyDef

CREATE TABLE - 图17

ReferenceOption

CREATE TABLE - 图18

CreateTableOptionListOpt

CREATE TABLE - 图19

PartitionOpt

CREATE TABLE - 图20

DuplicateOpt

CREATE TABLE - 图21

TableOptionList

CREATE TABLE - 图22

TableOption

CREATE TABLE - 图23

OnCommitOpt

CREATE TABLE - 图24

PlacementPolicyOption

CREATE TABLE - 图25

1. CreateTableStmt ::=
2. 'CREATE' OptTemporary 'TABLE' IfNotExists TableName ( TableElementListOpt CreateTableOptionListOpt PartitionOpt DuplicateOpt AsOpt CreateTableSelectOpt | LikeTableWithOrWithoutParen ) OnCommitOpt

4. OptTemporary ::=
5. ( 'TEMPORARY' | ('GLOBAL' 'TEMPORARY') )?

7. IfNotExists ::=
8. ('IF' 'NOT' 'EXISTS')?

10. TableName ::=
11. Identifier ('.' Identifier)?

13. TableElementListOpt ::=
14. ( '(' TableElementList ')' )?

16. TableElementList ::=
17. TableElement ( ',' TableElement )*

19. TableElement ::=
20. ColumnDef
21. |   Constraint

23. ColumnDef ::=
24. ColumnName ( Type | 'SERIAL' ) ColumnOptionListOpt

26. ColumnOptionListOpt ::=
27. ColumnOption*

29. ColumnOptionList ::=
30. ColumnOption*

32. ColumnOption ::=
33. 'NOT'? 'NULL'
34. |   'AUTO_INCREMENT'
35. |   PrimaryOpt 'KEY'
36. |   'UNIQUE' 'KEY'?
37. |   'DEFAULT' DefaultValueExpr
38. |   'SERIAL' 'DEFAULT' 'VALUE'
39. |   'ON' 'UPDATE' NowSymOptionFraction
40. |   'COMMENT' stringLit
41. |   ConstraintKeywordOpt 'CHECK' '(' Expression ')' EnforcedOrNotOrNotNullOpt
42. |   GeneratedAlways 'AS' '(' Expression ')' VirtualOrStored
43. |   ReferDef
44. |   'COLLATE' CollationName
45. |   'COLUMN_FORMAT' ColumnFormat
46. |   'STORAGE' StorageMedia
47. |   'AUTO_RANDOM' OptFieldLen

49. Constraint ::=
50. IndexDef
51. |   ForeignKeyDef

53. IndexDef ::=
54. ( 'INDEX' | 'KEY' ) IndexName? '(' KeyPartList ')' IndexOption?

56. KeyPartList ::=
57. KeyPart ( ',' KeyPart )*

59. KeyPart ::=
60. ColumnName ( '(' Length ')')? ( 'ASC' | 'DESC' )?
61. |   '(' Expression ')' ( 'ASC' | 'DESC' )?

63. IndexOption ::=
64. 'COMMENT' String
65. |   ( 'VISIBLE' | 'INVISIBLE' )

67. ForeignKeyDef
68. ::= ( 'CONSTRAINT' Identifier )? 'FOREIGN' 'KEY'
69. Identifier? '(' ColumnName ( ',' ColumnName )* ')'
70. 'REFERENCES' TableName '(' ColumnName ( ',' ColumnName )* ')'
71. ( 'ON' 'DELETE' ReferenceOption )?
72. ( 'ON' 'UPDATE' ReferenceOption )?

74. ReferenceOption
75. ::= 'RESTRICT'
76. | 'CASCADE'
77. | 'SET' 'NULL'
78. | 'SET' 'DEFAULT'
79. | 'NO' 'ACTION'

81. CreateTableOptionListOpt ::=
82. TableOptionList?

84. PartitionOpt ::=
85. ( 'PARTITION' 'BY' PartitionMethod PartitionNumOpt SubPartitionOpt PartitionDefinitionListOpt )?

87. DuplicateOpt ::=
88. ( 'IGNORE' | 'REPLACE' )?

90. TableOptionList ::=
91. TableOption ( ','? TableOption )*

93. TableOption ::=
94. PartDefOption
95. |   DefaultKwdOpt ( CharsetKw EqOpt CharsetName | 'COLLATE' EqOpt CollationName )
96. |   ( 'AUTO_INCREMENT' | 'AUTO_ID_CACHE' | 'AUTO_RANDOM_BASE' | 'AVG_ROW_LENGTH' | 'CHECKSUM' | 'TABLE_CHECKSUM' | 'KEY_BLOCK_SIZE' | 'DELAY_KEY_WRITE' | 'SHARD_ROW_ID_BITS' | 'PRE_SPLIT_REGIONS' ) EqOpt LengthNum
97. |   ( 'CONNECTION' | 'PASSWORD' | 'COMPRESSION' ) EqOpt stringLit
98. |   RowFormat
99. |   ( 'STATS_PERSISTENT' | 'PACK_KEYS' ) EqOpt StatsPersistentVal
100. |   ( 'STATS_AUTO_RECALC' | 'STATS_SAMPLE_PAGES' ) EqOpt ( LengthNum | 'DEFAULT' )
101. |   'STORAGE' ( 'MEMORY' | 'DISK' )
102. |   'SECONDARY_ENGINE' EqOpt ( 'NULL' | StringName )
103. |   'UNION' EqOpt '(' TableNameListOpt ')'
104. |   'ENCRYPTION' EqOpt EncryptionOpt
105. |    'TTL' EqOpt TimeColumnName '+' 'INTERVAL' Expression TimeUnit (TTLEnable EqOpt ( 'ON' | 'OFF' ))? (TTLJobInterval EqOpt stringLit)?
106. |   PlacementPolicyOption

108. OnCommitOpt ::=
109. ('ON' 'COMMIT' 'DELETE' 'ROWS')?

111. PlacementPolicyOption ::=
112. "PLACEMENT" "POLICY" EqOpt PolicyName
113. |   "PLACEMENT" "POLICY" (EqOpt | "SET") "DEFAULT"

TiDB 支持以下 table_option。TiDB 会解析并忽略其他 table_option 参数,例如 AVG_ROW_LENGTH、CHECKSUM、COMPRESSION、CONNECTION、DELAY_KEY_WRITE、ENGINE、KEY_BLOCK_SIZE、MAX_ROWS、MIN_ROWS、ROW_FORMAT 和 STATS_PERSISTENT。

参数 含义 举例
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
AUTO_ID_CACHE 用来指定 Auto ID 在 TiDB 实例中 Cache 的大小,默认情况下 TiDB 会根据 Auto ID 分配速度自动调整 AUTO_ID_CACHE = 200
AUTO_RANDOM_BASE 用来指定 AutoRandom 自增部分的初始值,该参数可以被认为属于内部接口的一部分,对于用户而言请忽略 AUTO_RANDOM_BASE = 0
CHARACTER SET 指定该表所使用的字符集 CHARACTER SET = ‘utf8mb4’
COLLATE 指定该表所使用的字符集排序规则 COLLATE = ‘utf8mb4_bin’
COMMENT 注释信息 COMMENT = ‘comment info’

CREATE TABLE - 图26

注意

在 TiDB 配置文件中,split-table 默认开启。当该配置项开启时,建表操作会为每个表建立单独的 Region,详情参见 TiDB 配置文件描述。

示例

创建一张简单表并插入一行数据:

1. CREATE TABLE t1 (a int);
2. DESC t1;
3. SHOW CREATE TABLE t1\G
4. INSERT INTO t1 (a) VALUES (1);
5. SELECT * FROM t1;
1. mysql> drop table if exists t1;
2. Query OK, 0 rows affected (0.23 sec)

4. mysql> CREATE TABLE t1 (a int);
5. Query OK, 0 rows affected (0.09 sec)

7. mysql> DESC t1;
8. +-------+---------+------+------+---------+-------+
9. | Field | Type    | Null | Key  | Default | Extra |
10. +-------+---------+------+------+---------+-------+
11. | a     | int(11) | YES  |      | NULL    |       |
12. +-------+---------+------+------+---------+-------+
13. 1 row in set (0.00 sec)

15. mysql> SHOW CREATE TABLE t1\G
16. *************************** 1. row ***************************
17. Table: t1
18. Create Table: CREATE TABLE `t1` (
19. `a` int(11) DEFAULT NULL
20. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
21. 1 row in set (0.00 sec)

23. mysql> INSERT INTO t1 (a) VALUES (1);
24. Query OK, 1 row affected (0.03 sec)

26. mysql> SELECT * FROM t1;
27. +------+
28. | a    |
29. +------+
30. |    1 |
31. +------+
32. 1 row in set (0.00 sec)

删除一张表。如果该表不存在,就建一张表:

1. DROP TABLE IF EXISTS t1;
2. CREATE TABLE IF NOT EXISTS t1 (
3. id BIGINT NOT NULL PRIMARY KEY auto_increment,
4. b VARCHAR(200) NOT NULL
5. );
6. DESC t1;
1. mysql> DROP TABLE IF EXISTS t1;
2. Query OK, 0 rows affected (0.22 sec)
3. mysql> CREATE TABLE IF NOT EXISTS t1 (
4. id BIGINT NOT NULL PRIMARY KEY auto_increment,
5. b VARCHAR(200) NOT NULL
6. );
7. Query OK, 0 rows affected (0.08 sec)
8. mysql> DESC t1;
9. +-------+--------------+------+------+---------+----------------+
10. | Field | Type         | Null | Key  | Default | Extra          |
11. +-------+--------------+------+------+---------+----------------+
12. | id    | bigint(20)   | NO   | PRI  | NULL    | auto_increment |
13. | b     | varchar(200) | NO   |      | NULL    |                |
14. +-------+--------------+------+------+---------+----------------+
15. 2 rows in set (0.00 sec)

MySQL 兼容性

  • 支持除空间类型以外的所有数据类型。
  • 不支持 FULLTEXT,HASH 和 SPATIAL 索引。
  • 为了与 MySQL 兼容,index_col_name 属性支持 length 选项,最大长度默认限制为 3072 字节。此长度限制可以通过配置项 max-index-length 更改,具体请参阅 TiDB 配置文件描述。
  • 为了与 MySQL 兼容,TiDB 会解析但忽略 index_col_name 属性的 [ASC | DESC] 索引排序选项。
  • COMMENT 属性不支持 WITH PARSER 选项。
  • TiDB 在单个表中默认支持 1017 列,最大可支持 4096 列。InnoDB 中相应的数量限制为 1017 列,MySQL 中的硬限制为 4096 列。详情参阅 TiDB 使用限制。
  • 当前仅支持 Range、Hash 和 Range Columns(单列)类型的分区表,详情参阅分区表。

另请参阅