不同表类型的特性
Key 列和排序键
主键 表 | Duplicate Key 表 | Aggregate 表 | Unique Key 表 | |
---|---|---|---|---|
Key 列和 UNIQUE 约束 | 主键具有 UNIQUE 约束和 NOT NULL 约束。 | Duplicate Key 不具有 UNIQUE 约束。 | Aggregate Key 具有 UNIQUE 约束。 | Unique Key 具有 UNIQUE 约束。 |
Key 列和数据更改之间的逻辑关系 | 如果新数据行的主键值与表中现有数据行的主键值相同,则会发生唯一性约束冲突。然后,新数据行将替换现有数据行。 与 Unique Key 表相比,Primary Key 表具有增强的底层存储引擎,因此可以替换 Unique Key 表。 | Duplicate Key 没有 UNIQUE 约束。因此,如果新数据行的 Duplicate Key 值与表中现有数据行的 Duplicate Key 值相同,则新旧数据行都将保留在表中。 | 如果新数据行的 Aggregate Key 值与表中现有数据行的 Aggregate Key 值相同,则将基于 Aggregate Key 和值列的聚合函数来聚合新旧数据行。 | 如果新数据行的 Unique Key 值与表中现有数据行的 Unique Key 值相同,则新数据行将替换现有数据行。 Unique Key 表可以看作是聚合函数为 replace 的 Aggregate 表。 |
Key 列和排序键之间的关系 | 自 v3.0.0 起,在 Primary Key 表中,排序键与主键分离。 | 自 v3.3.0 起,Duplicate Key 表支持使用 ORDER BY 指定排序键。如果同时使用 ORDER BY 和 DUPLICATE KEY ,则 ORDER BY 优先。 | 自 v3.3.0 起,排序键与 Aggregate 表中的 Aggregate Key 分离。Aggregate 表支持使用 ORDER BY 指定排序键,并使用 AGGREGATE KEY 指定 Aggregate Key。排序键和 Aggregate Key 中的列需要相同,但列的顺序不需要相同。 | 自 v3.3.0 起,排序键与 Unique Key 表中的 Unique Key 分离。Unique Key 表支持使用 ORDER BY 指定排序键,并使用 UNIQUE KEY 指定 Unique Key。排序键和 Unique Key 中的列需要相同,但列的顺序不需要相同。 |
Key 列和排序键支持的数据类型 | 数值型(包括整数和 BOOLEAN)、字符串和日期(DATE 和 DATETIME)。 | 数值型(包括整数、BOOLEAN 和 DECIMAL)、字符串和日期(DATE 和 DATETIME)。 | ||
Key 列与分区/分桶列之间的关系 | 分区列和分桶列必须在主键中。 | None (无) | 分区列和分桶列必须在 Aggregate Key 中。 | 分区列和分桶列必须在 Unique Key 中。 |
Key 列和 Value 列的数据类型
Key 列支持以下数据类型:数值型(包括整数、BOOLEAN 和 DECIMAL)、字符串和日期(DATE 和 DATETIME)。
注意
主键表的 Key 列不支持 DECIMAL 数据类型。
另一方面,Value 列支持基本数据类型,包括数值型、字符串和日期(DATE 和 DATETIME)。对于不同类型的表的值列,对 BITMAP、HLL 和半结构化类型的支持有所不同,如下详述
主键 表 | Duplicate Key 表 | Aggregate 表 | Unique Key 表 | |
---|---|---|---|---|
BITMAP | 支持 | 不支持 | 支持。聚合函数必须是 bitmap_union、replace 或 replace_if_not_null。 | 支持 |
HLL | 支持 | 不支持 | 支持。聚合函数必须是 hll_union、replace 或 replace_if_not_null。 | 支持 |
PERCENTILE | 支持 | 不支持 | 支持。聚合函数必须是 percentile_union、replace 或 replace_if_not_null。 | 支持 |
半结构化数据类型:JSON/ARRAY/MAP/STRUCT | 支持 | 支持 | 支持。聚合函数必须是 replace 或 replace_if_not_null。 | 支持 |
数据变更
主键 表 | Duplicate Key 表 | Aggregate 表 | Unique Key 表 | |
---|---|---|---|---|
通过数据加载进行 INSERT | 支持。 在加载作业中配置 __op=0 以实现 INSERT。在内部实现中,StarRocks 将 INSERT 和 UPDATE 操作都视为 UPSERT 操作。 | 支持 | 支持(具有相同 Aggregate Key 值的数据行将被聚合。) | 支持(具有相同 Unique Key 值的数据行将被更新。) |
通过数据加载进行 UPDATE | 不支持 | 支持(这可以通过使用 replace 作为聚合函数来实现。) | 支持(Unique Key 表本身可以被视为使用 replace 聚合函数的 Aggregate 表。) | |
通过数据加载进行 DELETE | 支持。 在加载作业中配置 __op=1 以实现 DELETE。 | 不支持 | ||
要加载的数据列值的完整性 | 默认情况下,所有列值都需要加载。但是,如果启用了部分列更新 (partial_update ),或者列具有默认值,则不需要加载所有列值。 | 默认情况下,所有列值都需要加载。但是,如果列具有默认值,则不需要加载所有列值。 | 默认情况下,所有列值都需要加载。但是,Aggregate 表可以通过将值列的聚合函数指定为 REPLACE_IF_NOT_NULL 来实现部分列更新。有关详细信息,请参见 aggr_type。此外,如果列具有默认值,则不需要加载所有列值。 | 默认情况下,所有列值都需要加载。但是,如果列具有默认值,则不需要加载所有列值。 |
DML INSERT | 支持 | |||
DML UPDATE |
| 不支持 | ||
DML DELETE |
|
|
|
与其他功能的兼容性
主键表 | Duplicate Key 表 | Aggregate 表 | Unique Key 表 | ||
---|---|---|---|---|---|
Bitmap 索引/Bloom Filter 索引 | 在 Key 列上构建索引 | 支持 | |||
在 Value 列上构建索引 | 支持 | 支持 | 不支持 | 不支持 | |
分区/分桶 | 表达式分区/列表分区 | 支持 | |||
随机分桶 | 不支持 | 自 v3.1 起支持 | 不支持 | 不支持 | |
物化视图 | 异步物化视图 | 支持 | |||
同步物化视图 | 不支持 | 支持 | 支持 | 支持 | |
其他功能 | CTAS | 支持 | 支持 | 不支持 | 不支持 |
备份和恢复 | 自 v2.5 起支持 | 支持 |