PingKai Logo下载

CREATE TABLE

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

语法图

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 )

TiDB 支持以下 table_option。TiDB 会解析并忽略其他 table_option 参数,例如 AVG_ROW_LENGTHCHECKSUMCOMPRESSIONCONNECTIONDELAY_KEY_WRITEENGINEKEY_BLOCK_SIZEMAX_ROWSMIN_ROWSROW_FORMATSTATS_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用来指定 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'
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 兼容性

  • 支持除空间类型以外的所有数据类型。
  • 为了兼容 MySQL,TiDB 在语法上支持 HASHBTREERTREE 等索引类型,但会忽略它们。
  • 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 使用限制
  • 分区表支持 HASHRANGELISTKEY 分区类型。对于不支持的分区类型,TiDB 会报 Warning: Unsupported partition type %s, treat as normal table 错误,其中 %s 为不支持的具体分区类型。
  • TiDB 对分区表进行了扩展。你可以指定 GLOBAL 索引选项将 PRIMARY KEYUNIQUE INDEX 设置为全局索引。该扩展与 MySQL 不兼容。

另请参阅