CREATE TABLE AS SELECT
功能
CREATE TABLE AS SELECT(简称 CTAS)语句可用于同步或异步查询原表并基于查询结果创建新表,然后将查询结果插入到新表中。
您可以通过 SUBMIT TASK 创建异步 CTAS 任务。
语法
-
同步查询原表并基于查询结果创建新表,然后将查询结果插入到新表中。
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [database.]table_name
[column_name1 [, column_name2, ...]]
[index_definition1 [, index_definition2, ...]]
[key_desc]
[COMMENT "table comment"]
[partition_desc]
[distribution_desc]
[ORDER BY (column_name1 [, column_name2, ...])]
[PROPERTIES ("key"="value", ...)]AS SELECT query
[ ... ] -
异步查询原表并基于查询结果创建新表,然后将查询结果插入到新表中。
SUBMIT [/*+ SET_VAR(key=value) */] TASK [[database.]<task_name>]AS
CREATE TABLE [IF NOT EXISTS] [database.]table_name
[column_name1 [, column_name2, ...]]
[index_definition1 [, index_definition2, ...]]
[key_desc]
[COMMENT "table comment"]
[partition_desc]
[distribution_desc]
[ORDER BY (column_name1 [, column_name2, ...])]
[PROPERTIES ("key"="value", ...)] AS SELECT query
[ ... ]
参数说明
参数 | 必填 | 描述 |
---|---|---|
TEMPORARY | 否 | 创建临时表。从 v3.3.1 版本开始,StarRocks 支持在 Default Catalog 中创建临时表。更多信息,请参见 临时表。目前,StarRocks 不支持通过 SUBMIT TASK 发起异步任务创建临时表。 |
column_name | 否 | 新表的列名。您无需指定列类型。StarRocks 会自动选择合适的列类型,并将 FLOAT 和 DOUBLE 转换为 DECIMAL(38,9);将 CHAR、VARCHAR 和 STRING 转换为 VARCHAR(65533)。 |
index_definition | 否 | 自 3.1.8 开始支持为新表创建 Bitmap 索引,语法是 INDEX index_name (col_name[, col_name, ...]) [USING BITMAP] [COMMENT ''] 。有关参数说明和使用限制,请参见 Bitmap 索引。 |
key_desc | 否 | 语法是 key_type (<col_name1> [, <col_name2>, ...]) 。参数:
|
COMMENT | 否 | 新表注释。 |
partition_desc | 否 | 新表的分区方式。如不指定该参数,则默认新表为无分区。更多有关分区的设置,参见 CREATE TABLE。 |
distribution_desc | 否 | 新表的分桶方式。如不指定该参数,则默认新表的分桶列为使用 CBO 优化器采集的统计信息中基数最高的列,且分桶数量默认为 10。如果 CBO 优化器没有采集基数信息,则默认新表的第一列为分桶列。更多有关分桶的设置,参见 CREATE TABLE。 |
ORDER BY | 否 | 自 v3.1.8 版本以来,如果新表是主键表,则可以为新表指定排序键。排序键可以是任意列的组合。主键表是指在创建表时指定了 PRIMARY KEY (xxx) 的表。 |
Properties | 否 | 新表的属性。 |
AS SELECT query | 是 | 查询结果。该参数支持如下值: 列。比如 ... AS SELECT a, b, c FROM table_a; ,其中 a 、b 和 c 为原表的列名。如果您没有为新表指定列名,那么新表的列名也为 a 、b 和 c 。 表达式。比如 ... AS SELECT a+1 AS x, b+2 AS y, c*c AS z FROM table_a; ,其中 a+1 、b+2 和 c*c 为原表的列名,x 、y 和 z 为新表的列名。 说明: 新表的列数需要与 AS SELECT query 中指定的列数保持一致。 建议您为新表的列设置具有业务意义的列名,便于后续识别使用。 |
注意事项
-
使用 CTAS 语句创建的新表需满足如下条件:
-
ENGINE
类型为OLAP
。 -
表类型默认为明细表,您也可以在
key_desc
中指定为主键表。 -
排序列为前三列且这三列类型的存储空间不能超过 36 个字节。
-
-
CTAS 语句不支持为新表设置索引。
-
如果 CTAS 语句由于 FE 重启或其他原因执行失败,可能会发生如下情况:
-
新表创建成功,但表中没有数据。
-
新表创建失败。
-
-
新表创建后,如果存在多种方式(比如 Insert Into)将数据插入到新表中,那么最先执行完插入操作的即最先将数据插入到新表中。
-
当异步查询原表并基于查询结果创建新表时,如果不指定 Task 名称,那么 StarRocks 会自动生成一个 Task 名称。