PingKai Logo下载

CREATE TABLE

该语句会在当前选定的数据库中创建一个新表。其行为与 MySQL 中的 CREATE TABLE 语句类似。

语法

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
ColumnDef Constraint
ColumnDef
ColumnName Type SERIAL ColumnOptionListOpt
ColumnOptionListOpt
ColumnOption
ColumnOptionList
ColumnOption
ColumnOption
NOT NULL AUTO_INCREMENT PrimaryOpt KEY GLOBAL LOCAL UNIQUE KEY GLOBAL LOCAL 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
ColumnName ( Length ) ASC DESC ( Expression ) ASC DESC
IndexOption
COMMENT String VISIBLE INVISIBLE USING TYPE BTREE RTREE HASH GLOBAL LOCAL
ForeignKeyDef
CONSTRAINT Identifier FOREIGN KEY Identifier ( ColumnName , ) REFERENCES TableName ( 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
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 AFFINITY EqOpt StringName PlacementPolicyOption
OnCommitOpt
ON COMMIT DELETE ROWS
PlacementPolicyOption
PLACEMENT POLICY EqOpt PolicyName PLACEMENT POLICY EqOpt SET DEFAULT
DefaultValueExpr
NowSymOptionFractionParentheses SignedLiteral NextValueForSequenceParentheses BuiltinFunction
BuiltinFunction
( BuiltinFunction ) identifier ( ) identifier ( ExpressionList ) REPLACE ( ExpressionList )
NowSymOptionFractionParentheses
( NowSymOptionFractionParentheses ) NowSymOptionFraction
NowSymOptionFraction
NowSym NowSymFunc ( ) NowSymFunc ( NUM ) CurdateSym ( ) CURRENT_DATE
NextValueForSequenceParentheses
( NextValueForSequenceParentheses ) NextValueForSequence
NextValueForSequence
NEXT VALUE forKwd TableName NEXTVAL ( TableName )

下列 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) 个 RegionPRE_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'

示例

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

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 索引。

  • 在分区表中,将 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 为具体不支持的分区类型。

另请参阅