PingKai Logo下载

CREATE TABLE ... SELECT

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

语法图

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要创建的表名。
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;

另请参阅