GBase 8a
其他
文章

主键功能简介

发表于2025-12-25 10:53:23103次浏览0个评论

功能描述
主键特性:唯一性、非空性、不可变性。

主键表功能概述:
支持创建表时创建主键(hash分布表、复制表、分区表)
支持对已有表添加主键
支持主键表删除主键,但是基于自增列的主键不可删除
存在主键的表不可删除hash分布列属性
主键列的数据类型不可修改
支持主键表的DML操作和load操作

主键表功能详细说明:
1.8a主键分类:共两类
基于自增列的主键
含有自增列的表,自增列即为唯一的主键列,主键的索引类型为无。自增列的操作不受主键的约束,保持原自增列的操作规则。
基于索引的主键
没有自增列的表创建主键均为索引主键。索引主键有两个功能模块,一个是约束模块检查主键规则,一个是索引模块即哈希索引,用于检查单个分片内主键唯一性校验(数据一致性和写入的原子性)。
索引主键创建内部流程:检查表定义是否符合主键表要求,如符合则定义主键成功,同时在主键列上创建hash索引,如为联合主键,则创建多列hash索引。
注:
(1)多列联合主键上创建多列hash索引,此hash索引仅应用于主键,不应用于查询优化。多列hash索引命名为列的序号拼接,如C00001C00003.ghi。多列hash索引中序号最大的列是索引的主列,负责整个索引的维护操作(如并行)。
(2)非主键场景的单纯创建hash索引仍然不支持创建多列hash索引。

2.主键表DDL规则(新):
(1)哈希分布表的分布列必须全部包含在主键中,哈希分布表存在主键时禁止删除hash分布列属性
(2)分区表的分区列及子分区列(包括LIST和RANGE分区表达式中分区列)必须全部包含在主键中;key分区,如果key值为空,默认主键为key分区列
(3)随机分布表不可以定义主键
(4)主键列的数据类型必须全部是主键支持的数据类型(如下),且必须定义为NOT NULL。主键列的数据类型不可修改
tinyint、smallint、int、bigint、decimal、numeric、varchar、date、datetime、time
(5)支持在已创建主键的表上删除主键,删除主键时会删除所有列的主键约束。主键列在主键被删除之前不可被删除
(6)同一张表上只能同时存在一个主键,支持多列联合主键,最多支持10列。不支持在已有主键上添加联合主键,即扩充其他字段作为联合主键。
(7)如表中存在自增列,则该自增列必须是唯一主键列,且忽略规则(1)~(5)。基于自增列的主键不可删除。
(8)支持在已有表上创建主键。不支持新增一列为主键列,仅支持在已有列上添加主键约束,主键列已有数据必须为NOT NULL且不存在重复值
(9)支持create table like语法创建同主键的表,不支持create table as select创建主键表

3.主键表DML规则(新):
1)如有对应主键列的新数据(insert、load)不符合唯一性约束,则报错退出
2)merge语句中,源表和目标表必须都包含主键,不支持merge更新主键列,merge插入必须包含主键列
3)主键表的主键列禁止任何形式的update

4.语法:
创建表时定义主键
create table table_name(col_def,...,primary key(part,...))[table_options]
create table table_name(col_def primary key,col_def,...)[table_options]
已有表添加主键列
alter table table_name ADD PRIMARY KEY(part,...) | DROP PRIMARY KEY
查看主键信息
show create table 
查看到主键上的索引信息
show full create table

评论已关闭