想必大家都了解传统数据库如Oracle、MySQL中主键与唯一索引的区别,Trafodion中也有主键和唯一索引,但Trafodion中的主键与唯一索引的区别与传统数据库中不完全相同,我想这主要归根于Trafodion主键的特殊性。
首先,由于Trafodion底层是基于HBase,Trafodion在建表时会把主键映射为HBase的Row Key,因此我们可以把Trafodion表当成一个主索引,即数据在流入Trafodion表后都是基于主键字段排序存储的,而基于Trafodion上的字段单独创建的索引可以当成是二级索引(用单独的Trafodion表实现)。而在传统数据库里面,主键只是一种约束,创建主键=创建主键约束+唯一索引。
其次,从语法上,创建主键和创建唯一索引肯定是不同的,创建主键主要有两种方法:
- 建表时创建
create table t_ly1(a int not null, b int) primary key(a);
或
create table t_ly1(a int not null primary key, b int);
- 建表后创建
alter table t_ly2 add primary key(a);
而创建唯一索引的语法与创建普通索引的语法差不多,只是多了一个UNIQUE关键字:
create unique index idx_t_ly2_b on t_ly2(b);
除了以上区别,Trafodion表中的主键与索引的区别还有,
1.主键定义表按照主键字段排序存储,唯一索引为一种索引,使用单独的Trafodion实现;
3.主键通常不允许空值,即主键中的每个字段必须定义NOT NULL属性,而唯一索引中的字段可以为空;
4.主键可以被其他表引用(FK),而唯一索引不可以;
5.一个表最多只能创建一个主键,而可以创建多个唯一索引;
6.主键和索引都可以分区,当前版本中,可以基于主键所有字段或任意部分字段分区,而索引只能用SALT LIKE TABLE方式。