CREATE TABLE ... SELECT
CREATE TABLE ... SELECT(也称 CTAS)用于基于查询结果创建新表,并将查询结果写入该表。
语法图
- CreateTableAsSelectStmt
- AsOpt
- CreateTableSelect
- OptTemporary
- IfNotExists
- TableName
CreateTableAsSelectStmt ::=
'CREATE' OptTemporary 'TABLE' IfNotExists TableName AsOpt CreateTableSelect
AsOpt ::=
'AS'?
CreateTableSelect ::=
SelectStmt
| UnionStmt
OptTemporary ::=
( 'TEMPORARY' | ('GLOBAL' 'TEMPORARY') )?
IfNotExists ::=
('IF' 'NOT' 'EXISTS')?
TableName ::=
Identifier ('.' Identifier)?
语法元素说明
| 语法元素 | 说明 |
|---|---|
TableName | 要创建的表名。 |
AsOpt | AS 关键字(可省略)。 |
OptTemporary | 指定临时表(TEMPORARY 或 GLOBAL TEMPORARY)。 |
CreateTableSelect | SELECT 或 UNION 查询。CTAS 会基于其输出列生成列定义并写入数据。 |
SelectStmt | SELECT 查询。CTAS 会基于其输出列生成列定义并写入数据。 |
UnionStmt | 由 UNION/UNION ALL 组合的查询。 |
IfNotExists | 若表已存在,则不创建表,也不会写入数据。 |
行为说明
- 新表的列定义来自查询的输出列(列名、顺序、类型等)。
- CTAS 不会自动为新表创建索引、主键、外键等约束。如需这些对象,请先使用
CREATE TABLE定义结构,再通过INSERT INTO ... SELECT ...导入数据。
相关配置
开启 CTAS(TiDB 配置项)
CTAS 为实验特性,默认关闭。要启用 CTAS,需要在 TiDB 配置中将 experimental.enable-create-table-as-select 设置为 true。
控制写入方式(会话变量)
可以通过会话级系统变量 tidb_create_from_select_using_import 控制 CTAS 的写入方式:
SET @@SESSION.tidb_create_from_select_using_import = 1;
当该变量为 1 且存储引擎为 TiKV 时,CTAS 会尝试使用 IMPORT INTO 路径写入数据;否则使用常规的写入路径(等价于 INSERT INTO ... SELECT ... 的写入方式)。
示例
基于查询结果创建表并写入数据
CREATE TABLE t_src (id INT, v VARCHAR(10));
INSERT INTO t_src VALUES (1, 'a'), (2, 'b');
CREATE TABLE t_dst AS SELECT id, v FROM t_src;
使用列别名控制新表列名与类型
CREATE TABLE t_cast AS SELECT COUNT(id) as id_num FROM t_src;
使用 UNION 创建表
CREATE TABLE t_union AS
SELECT 1 AS id, 'a' AS v
UNION ALL
SELECT 2, 'b';
仅生成表结构(不写入数据)
CREATE TABLE t_schema_only AS
SELECT * FROM t_src WHERE 1=0;