CREATE TABLE
CREATE TABLE
语句用于在当前所选数据库中创建新表,与 MySQL 中 CREATE TABLE
语句的行为类似。另可参阅单独的 CREATE TABLE LIKE
文档。
语法图
- CreateTableStmt
- OptTemporary
- IfNotExists
- TableName
- TableElementListOpt
- TableElementList
- TableElement
- ColumnDef
- ColumnOptionListOpt
- ColumnOptionList
- ColumnOption
- Constraint
- IndexDef
- KeyPartList
- KeyPart
- IndexOption
- ForeignKeyDef
- ReferenceOption
- CreateTableOptionListOpt
- PartitionOpt
- DuplicateOpt
- TableOptionList
- TableOption
- OnCommitOpt
- PlacementPolicyOption
CreateTableStmt ::=
'CREATE' OptTemporary 'TABLE' IfNotExists TableName ( TableElementListOpt CreateTableOptionListOpt PartitionOpt DuplicateOpt AsOpt CreateTableSelectOpt | LikeTableWithOrWithoutParen ) OnCommitOpt
OptTemporary ::=
( 'TEMPORARY' | ('GLOBAL' 'TEMPORARY') )?
IfNotExists ::=
('IF' 'NOT' 'EXISTS')?
TableName ::=
Identifier ('.' Identifier)?
TableElementListOpt ::=
( '(' TableElementList ')' )?
TableElementList ::=
TableElement ( ',' TableElement )*
TableElement ::=
ColumnDef
| Constraint
ColumnDef ::=
ColumnName ( Type | 'SERIAL' ) ColumnOptionListOpt
ColumnOptionListOpt ::=
ColumnOption*
ColumnOptionList ::=
ColumnOption*
ColumnOption ::=
'NOT'? 'NULL'
| 'AUTO_INCREMENT'
| PrimaryOpt 'KEY'
| 'UNIQUE' 'KEY'?
| 'DEFAULT' DefaultValueExpr
| 'SERIAL' 'DEFAULT' 'VALUE'
| 'ON' 'UPDATE' NowSymOptionFraction
| 'COMMENT' stringLit
| ConstraintKeywordOpt 'CHECK' '(' Expression ')' EnforcedOrNotOrNotNullOpt
| GeneratedAlways 'AS' '(' Expression ')' VirtualOrStored
| ReferDef
| 'COLLATE' CollationName
| 'COLUMN_FORMAT' ColumnFormat
| 'STORAGE' StorageMedia
| 'AUTO_RANDOM' OptFieldLen
Constraint ::=
IndexDef
| ForeignKeyDef
IndexDef ::=
( 'INDEX' | 'KEY' ) IndexName? '(' KeyPartList ')' IndexOption?
KeyPartList ::=
KeyPart ( ',' KeyPart )*
KeyPart ::=
ColumnName ( '(' Length ')')? ( 'ASC' | 'DESC' )?
| '(' Expression ')' ( 'ASC' | 'DESC' )?
IndexOption ::=
'COMMENT' String
| ( 'VISIBLE' | 'INVISIBLE' )
| ('USING' | 'TYPE') ('BTREE' | 'RTREE' | 'HASH')
ForeignKeyDef
::= ( 'CONSTRAINT' Identifier )? 'FOREIGN' 'KEY'
Identifier? '(' ColumnName ( ',' ColumnName )* ')'
'REFERENCES' TableName '(' ColumnName ( ',' ColumnName )* ')'
( 'ON' 'DELETE' ReferenceOption )?
( 'ON' 'UPDATE' ReferenceOption )?
ReferenceOption
::= 'RESTRICT'
| 'CASCADE'
| 'SET' 'NULL'
| 'SET' 'DEFAULT'
| 'NO' 'ACTION'
CreateTableOptionListOpt ::=
TableOptionList?
PartitionOpt ::=
( 'PARTITION' 'BY' PartitionMethod PartitionNumOpt SubPartitionOpt PartitionDefinitionListOpt )?
DuplicateOpt ::=
( 'IGNORE' | 'REPLACE' )?
TableOptionList ::=
TableOption ( ','? TableOption )*
TableOption ::=
PartDefOption
| DefaultKwdOpt ( CharsetKw EqOpt CharsetName | 'COLLATE' EqOpt CollationName )
| ( '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
| ( 'CONNECTION' | 'PASSWORD' | 'COMPRESSION' ) EqOpt stringLit
| RowFormat
| ( 'STATS_PERSISTENT' | 'PACK_KEYS' ) EqOpt StatsPersistentVal
| ( 'STATS_AUTO_RECALC' | 'STATS_SAMPLE_PAGES' ) EqOpt ( LengthNum | 'DEFAULT' )
| 'STORAGE' ( 'MEMORY' | 'DISK' )
| 'SECONDARY_ENGINE' EqOpt ( 'NULL' | StringName )
| 'UNION' EqOpt '(' TableNameListOpt ')'
| 'ENCRYPTION' EqOpt EncryptionOpt
| 'TTL' EqOpt TimeColumnName '+' 'INTERVAL' Expression TimeUnit (TTLEnable EqOpt ( 'ON' | 'OFF' ))? (TTLJobInterval EqOpt stringLit)?
| PlacementPolicyOption
OnCommitOpt ::=
('ON' 'COMMIT' 'DELETE' 'ROWS')?
PlacementPolicyOption ::=
"PLACEMENT" "POLICY" EqOpt PolicyName
| "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 t1 (a int);
DESC t1;
SHOW CREATE TABLE t1\G
INSERT INTO t1 (a) VALUES (1);
SELECT * FROM t1;
mysql> drop table if exists t1;
Query OK, 0 rows affected (0.23 sec)
mysql> CREATE TABLE t1 (a int);
Query OK, 0 rows affected (0.09 sec)
mysql> DESC t1;
+-------+---------+------+------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+------+---------+-------+
| a | int(11) | YES | | NULL | |
+-------+---------+------+------+---------+-------+
1 row in set (0.00 sec)
mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)
mysql> INSERT INTO t1 (a) VALUES (1);
Query OK, 1 row affected (0.03 sec)
mysql> SELECT * FROM t1;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
删除一张表。如果该表不存在,就建一张表:
DROP TABLE IF EXISTS t1;
CREATE TABLE IF NOT EXISTS t1 (
id BIGINT NOT NULL PRIMARY KEY auto_increment,
b VARCHAR(200) NOT NULL
);
DESC t1;
mysql> DROP TABLE IF EXISTS t1;
Query OK, 0 rows affected (0.22 sec)
mysql> CREATE TABLE IF NOT EXISTS t1 (
id BIGINT NOT NULL PRIMARY KEY auto_increment,
b VARCHAR(200) NOT NULL
);
Query OK, 0 rows affected (0.08 sec)
mysql> DESC t1;
+-------+--------------+------+------+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+------+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| b | varchar(200) | NO | | NULL | |
+-------+--------------+------+------+---------+----------------+
2 rows in set (0.00 sec)
MySQL 兼容性
- 支持除空间类型以外的所有数据类型。
- 为了兼容 MySQL,TiDB 在语法上支持
HASH
、BTREE
和RTREE
等索引类型,但会忽略它们。 - TiDB 支持解析
FULLTEXT
语法,但不支持使用FULLTEXT
索引。 - 为了与 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 使用限制。
- 分区表支持
HASH
、RANGE
、LIST
和KEY
分区类型。对于不支持的分区类型,TiDB 会报Warning: Unsupported partition type %s, treat as normal table
错误,其中%s
为不支持的具体分区类型。