CREATE TABLE
该语句会在当前选定的数据库中创建一个新表。其行为与 MySQL 中的 CREATE TABLE 语句类似。
语法
- 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
- DefaultValueExpr
- BuiltinFunction
- NowSymOptionFractionParentheses
- NowSymOptionFraction
- NextValueForSequenceParentheses
- NextValueForSequence
下列 table_options 受支持。其他选项如 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 | 设置 TiDB 实例中自增 ID 的 cache 大小。默认情况下,TiDB 会根据自增 ID 的分配速度自动调整该大小 | AUTO_ID_CACHE = 200 |
AUTO_RANDOM_BASE | 设置 auto_random 的初始递增部分的值。该选项可视为内部接口的一部分,用户可忽略此参数 | AUTO_RANDOM_BASE = 0 |
CHARACTER SET | 指定表的 字符集 | CHARACTER SET = 'utf8mb4' |
COLLATE | 指定表的字符集排序规则 | COLLATE = 'utf8mb4_bin' |
COMMENT | 注释信息 | COMMENT = 'comment info' |
AFFINITY | 为表或分区启用亲和性调度。对于非分区表可设置为 'table',对于分区表可设置为 'partition'。设置为 'none' 或留空则禁用亲和性调度。 | AFFINITY = 'table' |
注意
- TiDB 会为每个新建表创建一个独立的 Region。
- 在使用
AFFINITY前,请注意:不支持对已启用亲和性的表进行分区方案的修改(如添加、删除、重组或交换分区),也不支持在临时表或视图上配置AFFINITY。
示例
创建一个简单表并插入一行数据:
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 | 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 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 | NO | PRI | NULL | auto_increment |
| b | varchar(200) | NO | | NULL | |
+-------+--------------+------+------+---------+----------------+
2 rows in set (0.00 sec)MySQL 兼容性
-
支持除空间类型外的所有数据类型。
-
TiDB 为了与 MySQL 兼容,语法上接受如
HASH、BTREE和RTREE等索引类型,但会被忽略。 -
TiDB Self-Managed 支持解析
FULLTEXT语法,但不支持使用FULLTEXT索引。注意
目前,仅部分 AWS 区域的平凯数据库云服务 Starter 实例支持
FULLTEXT语法和索引。 -
在分区表中,将
PRIMARY KEY或UNIQUE INDEX设置为 全局索引(通过GLOBAL索引选项)是 TiDB 的扩展功能,并不兼容 MySQL。
- 为了兼容,
index_col_name属性支持长度选项,默认最大长度限制为 3072 字节。
index_col_name中的[ASC | DESC]目前会被解析但被忽略(与 MySQL 5.7 行为兼容)。COMMENT属性不支持WITH PARSER选项。- TiDB 默认支持单表 1017 列,最多支持 4096 列。InnoDB 中的对应数量限制为 1017 列,MySQL 的硬限制为 4096 列。详情参见 TiDB 限制。
- TiDB 支持
HASH、RANGE、LIST和KEY分区类型。对于不支持的分区类型,TiDB 会返回Warning: Unsupported partition type %s, treat as normal table,其中%s为具体不支持的分区类型。