CREATE TABLE
功能
该语句用于创建表。
注意
该操作需要有在对应数据库内的建表权限 (CREATE TABLE)。
语法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, ...]
[, index_definition1[, index_definition2, ...]])
[ENGINE = [olap|mysql|elasticsearch|hive|iceberg|hudi|jdbc]]
[key_desc]
[COMMENT "table comment"]
[partition_desc]
[distribution_desc]
[rollup_index]
[ORDER BY (column_name1,...)]
[PROPERTIES ("key"="value", ...)]
[BROKER PROPERTIES ("key"="value", ...)]
参数说明
在指定数据库名、表名和列名等变量时,如果使用了保留关键字,必须使用反引号 (`) 包裹,否则可能会产生报错。有关 StarRocks 的保留关键字列表,请参见关键字。
column_definition
语法:
col_name col_type [agg_type] [NULL | NOT NULL] [DEFAULT "default_value"] [AUTO_INCREMENT] [AS generation_expr]
说明:
col_name:列名称
注意,在一般情况下,不能直接创建以以 __op
或 __row
开头命名的列,因为此类列名被 StarRocks 保留用于特殊目的,创建这样的列可能导致未知行为。如需创建这样的列,必须将 FE 动态参数 allow_system_reserved_names
设置为 TRUE
。
col_type:列数据类型
支持的列类型以及取值范围等信息如下:
-
TINYINT(1字节) 范围:-2^7 + 1 ~ 2^7 - 1
-
SMALLINT(2字节) 范围:-2^15 + 1 ~ 2^15 - 1
-
INT(4字节) 范围:-2^31 + 1 ~ 2^31 - 1
-
BIGINT(8字节) 范围:-2^63 + 1 ~ 2^63 - 1
-
LARGEINT(16字节) 范围:-2^127 + 1 ~ 2^127 - 1
-
FLOAT(4字节) 支持科学计数法。
-
DOUBLE(8字节) 支持科学计数法。
-
DECIMAL[(precision, scale)] (16字节) 保证精度的小数类型。默认是 DECIMAL(10, 0) precision: 1 ~ 38 scale: 0 ~ precision 其中整数部分为:precision - scale 不支持科学计数法。
-
DATE(3字节) 范围:0000-01-01 ~ 9999-12-31
-
DATETIME(8字节) 范围:0000-01-01 00:00:00 ~ 9999-12-31 23:59:59
-
CHAR[(length)]
定长字符串。长度范围:1 ~ 255。默认为 1。
-
VARCHAR[(length)]
变长字符串。单位:字节,默认取值为
1
。- StarRocks 2.1.0 之前的版本,
length
的取值范围为 1~65533。 - 【公测中】自 StarRocks 2.1.0 版本开始,
length
的取值范围为 1~1048576。
- StarRocks 2.1.0 之前的版本,
-
HLL (1~16385个字节)
HLL 列类型,不需要指定长度和默认值,长度根据数据的聚合程度系统内控制,并且 HLL 列只能通过配套的 hll_union_agg、hll_cardinality、hll_hash进行查询或使用。
-
BITMAP BITMAP 列类型,不需要指定长度和默认值。表示整型的集合,元素个数最大支持到 2^64 - 1。
-
ARRAY 支持在一个数组中嵌套子数组,最多可嵌套 14 层。您必须使用尖括号( < 和 > )来声明 ARRAY 的元素类型,如 ARRAY < INT >。目前不支持将数组中的元素声明为 Fast Decimal 类型。
agg_type:聚合类型,如果不指定,则该列为 key 列。否则,该列为 value 列。
支持的聚合类型如下:
* SUM、MAX、MIN、REPLACE
* HLL_UNION(仅用于 HLL列,为 HLL 独有的聚合方式)。
* BITMAP_UNION(仅用于 BITMAP 列,为 BITMAP 独有的聚合方式)。
* REPLACE_IF_NOT_NULL:这个聚合类型的含义是当且仅当新导入数据是非 NULL 值时会发生替换行为。如果新导入的数据是 NULL,那么 StarRocks 仍然会保留原值。
注意:
- BITMAP_UNION 聚合类型列在导入时的原始数据类型必须是
TINYINT, SMALLINT, INT, BIGINT
。 - 如果在建表时
REPLACE_IF_NOT_NULL
列指定了 NOT NULL,那么 StarRocks 仍然会将其转化 NULL,不会向用户报错。用户可以借助这个类型完成「部分列导入」的功能。
该类型只对聚合表有用 (key_desc
的 type
为 AGGREGATE KEY
)。自 3.1.9 起,REPLACE_IF_NOT_NULL
新增支持 BITMAP 类型的列。
NULL | NOT NULL:列数据是否允许为 NULL
。其中明细模型、聚合模型和更新模型表中所有列都默认指定 NULL
。主键模型表的指标列默认指定 NULL
,维度列默认指定 NOT NULL
。如源数据文件中存在 NULL
值,可以用 \N
来表示,导入时 StarRocks 会将其解析为 NULL
。
DEFAULT "default_value":列数据的默认值。导入数据时,如果该列对应的源数据文件中的字段为空,则自动填充 DEFAULT
关键字中指定的默认值。支持以下三种指定方式:
- DEFAULT current_timestamp:默认值为当前时间。参见 current_timestamp() 。
- DEFAULT
<默认值>
:默认值为指定类型的值。例如,列类型为 VARCHAR,即可指定默认值为DEFAULT "beijing"
。当前不支持指定 ARRAY、BITMAP、JSON、HLL 和 BOOLEAN 类型为默认值。 - DEFAULT (
<表达式>
):默认值为指定函数返回的结果。目前仅支持 uuid() 和 uuid_numeric() 表达式。
AUTO_INCREMENT:指定自增列。自增列的数据类型只支持 BIGINT,自增 ID 从 1 开始增加,自增步长为 1。有关自增列的详细说明,请参见 AUTO_INCREMENT。自 v3.0,StarRocks 支持该功能。
AS generation_expr:指定生成列和其使用的表达式。生成列用于预先计算并存储表达式的结果,可以加速包含复杂表达式的查询。自 v3.1,StarRocks 支持该功能。
index_definition
建表时仅支持创建 bitmap 索引,语法如下。有关参数说明和使用限制,请参见 Bitmap 索引。
INDEX index_name (col_name[, col_name, ...]) [USING BITMAP] [COMMENT '']
ENGINE 类型
默认为 olap
,表示创建的是 StarRocks 内部表。
可选值:mysql
、elasticsearch
、hive
、jdbc
(2.3 及以后)、iceberg
、hudi
(2.2 及以后)。如果指定了可选值,则创建的是对应类型的外部表 (external table),在建表时需要使用 CREATE EXTERNAL TABLE。更多信息,参见外部表。
从 3.0 版本起,对于查询 Hive、Iceberg、Hudi 和 JDBC 数据源的场景,推荐使用 Catalog 直接查询,不再推荐外部表的方式。具体参见 Hive catalog、Iceberg catalog、Hudi catalog 和 JDBC catalog。
从 3.1 版本起,支持直接在 Iceberg catalog 内创建表(当前仅支持 Parquet 格式的表),您可以通过 INSERT INTO 把数据插入到 Iceberg 表中。参见 创建 Iceberg 表。
-
如果是 mysql,则需要在 properties 提供以下信息:
PROPERTIES (
"host" = "mysql_server_host",
"port" = "mysql_server_port",
"user" = "your_user_name",
"password" = "your_password",
"database" = "database_name",
"table" = "table_name"
)注意: "table" 条目中的 "table_name" 是 MySQL 中的真实表名。 而 CREATE TABLE 语句中的 table_name 是该 MySQL 表在 StarRocks 中的名字,可以不同。
在 StarRocks 创建 MySQL 表的目的是可以通过 StarRocks 访问 MySQL 数据库。 而 StarRocks 本身并不维护、存储任何 MySQL 数据。
-
如果是 elasticsearch,则需要在 properties 提供以下信息:
PROPERTIES (
"hosts" = "http://192.168.0.1:8200,http://192.168.0.2:8200",
"user" = "root",
"password" = "root",
"index" = "tindex",
"type" = "doc"
)其中
hosts
为 Elasticsearch 集群连接地址,可指定一个或者多个,user 和 password
为开启 basic 认证的 Elasticsearch 集群的用户名/密码,index
是 StarRocks 中的表对应的 Elasticsearch 的 index 名字,可以是 alias,type
指定 index 的类型,默认是doc
。 -
如果是 hive,则需要在 properties 提供以下信息:
PROPERTIES (
"database" = "hive_db_name",
"table" = "hive_table_name",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
)其中
database
是 Hive 表对应的库名字,table
是 hive 表的名字,hive.metastore.uris
是 Hive metastore 服务地址。 -
如果是 jdbc,则需要在 properties 提供以下信息:
PROPERTIES (
"resource"="jdbc0",
"table"="dest_tbl"
)其中
resource
是所使用 JDBC 资源的名称。table
是目标数据库表名。 -
如果是 iceberg,则需要在 properties 提供 以下信息:
PROPERTIES (
"resource" = "iceberg0",
"database" = "iceberg",
"table" = "iceberg_table"
)其中
resource
是引用的 Iceberg 资源的名称。database
是 Iceberg 表所属的数据库名称。table
Iceberg 表名称。 -
如果是 hudi,则需要在 properties 提供以下信息:
PROPERTIES (
"resource" = "hudi0",
"database" = "hudi",
"table" = "hudi_table"
)其中
resource
是 Hudi 资源的名称。database
是 Hudi 表所属的数据库名称。table
Hudi 表名称。
key_desc
语法:
`key_type(k1[,k2 ...])`
说明
数据按照指定的 key 列进行排序,且根据不同的 key_type
具有不同特性。
key_type
支持以下类型:
- AGGREGATE KEY: key 列相同的记录,value 列按照指定的聚合类型进行聚合,适合报表、多维分析等业务场景。
- UNIQUE KEY/PRIMARY KEY: key 列相同的记录,value 列按导入顺序进行覆盖,适合按 key 列进行增删改查的点查询 (point query) 业务。
- DUPLICATE KEY: key 列相同的记录,同时存在于 StarRocks 中,适合存储明细数据或者数据无聚合特性的业务场景。
默认为 DUPLICATE KEY,数据按 key 列做排序。
除 AGGREGATE KEY 外,其他 key_type
在建表时,value
列不需要指定聚合类型 (agg_type)。