CREATE TABLE ... SELECT

CREATE TABLE ... SELECT(也称 CTAS)用于基于查询结果创建新表,并将查询结果写入该表。

语法图

CreateTableAsSelectStmt
CREATEOptTemporaryTABLEIfNotExistsTableNameAsOptCreateTableSelect
AsOpt
AS
CreateTableSelect
SelectStmtUnionStmt
OptTemporary
TEMPORARYGLOBALTEMPORARY
IfNotExists
IFNOTEXISTS
TableName
Identifier.Identifier

语法元素说明

语法元素说明
TableName要创建的表名。
AsOptAS 关键字(可省略)。
OptTemporary指定临时表(TEMPORARYGLOBAL TEMPORARY)。
CreateTableSelectSELECTUNION 查询。CTAS 会基于其输出列生成列定义并写入数据。
SelectStmtSELECT 查询。CTAS 会基于其输出列生成列定义并写入数据。
UnionStmtUNION/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;

另请参阅