主键约束(PRIMARY KEY)
唯一性约束(UNIQUE)
唯一索引(UNIQUE INDEX)
唯一性约束和主键约束的区别:
唯一约束和唯一索引的区别:
前者是用来检查数据的正确性,后者用来实现数据查询的优化,目的不同。唯一性约束与唯一索引有所不同:
- 创建唯一约束会在GBase 8s中创建一个constraint,同时也会创建一个该约束对应的唯一索引;
- 创建唯一索引只会创建一个唯一索引,不会创建constraint;
也就是说其实唯一约束是通过创建唯一索引来实现的。
以下示例来说明这三者之间的区别:1,创建表、导入基础数据
drop table if exists tab1;
create table tab1(col1 int, col2 varchar(20), col3 varchar(20));
insert into tab1 values(1,\’test001\’,\’test001\’);
insert into tab1 values(2,null,\’test002\’);
insert into tab1 values(3,\’test003\’,null);
2,创建主键、唯一约束和唯一索引主键唯一值且不允许为null,唯一约束值唯一但允许null,唯一索引值唯一但允许null
alter table tab1 add constraint primary key(col1) constraint pk_tab1_col1;
alter table tab1 add constraint unique(col2) constraint uk_tab1_col2;
create unique index ux_tab1_col3 on tab1 (col3);
查看表的报告,可以看到三个索引(对应主键、唯一约束和唯一索引),但需要注意的是主键、唯一约束的索引名称并不是指定的约束名称
oncheck -pt testdb:tab1 | grep \’fragment partition\’
Index 102_3 fragment partition datadbs01 in DBspace datadbs01
Index 102_4 fragment partition datadbs01 in DBspace datadbs01
Index ux_tab1_col3 fragment partition datadbs01 in DBspace datadbs01
3,测试区别
insert into tab1 values(null,\’test004\’,\’test004\’);
将报错误:703: Primary key on table (tab1) has a field with a null key value.不允许空值。
insert into tab1 values(3,\’test005\’,\’test005\’);
将报错误:268: Unique constraint (gbasedbt.pk_tab1_col1) violated.违反主键约束(pk_tab1_col1),因已经存在值 3 。
insert into tab1 values(4,null,\’test006\’);
将报错误:268: Unique constraint (gbasedbt.uk_tab1_col2) violated.违反唯一约束(uk_tab1_col2),因已经存在值 null 。
insert into tab1 values(5,\’test003\’,\’test007\’);
将报错误:268: Unique constraint (gbasedbt.uk_tab1_col2) violated.违反唯一约束(uk_tab1_col2),因已经存在值 test003 。
insert into tab1 values(6,\’test008\’,null);
将报错误:239: Could not insert new row – duplicate value in a UNIQUE INDEX column (Unique Index:ux_tab1_col3).不允许插入重复值,因已经存在值 null 。
insert into tab1 values(7,\’test009\’,\’test002\’);
将报错误:239: Could not insert new row – duplicate value in a UNIQUE INDEX column (Unique Index:ux_tab1_col3).不允许插入重复值,因已经存在值 test002 。
insert into tab1 values(8,\’test010\’,\’test010\’);
插入成功。
alter table tab1 drop constraint uk_tab1_col2;
oncheck -pt testdb:tab1 | grep \’fragment partition\’
Index 102_3 fragment partition datadbs01 in DBspace datadbs01
Index ux_tab1_col3 fragment partition datadbs01 in DBspace datadbs01
删除约束,对应的索引一并删除。
细心的你,会发现:
到此这篇关于GBase 8s数据库主键约束、唯一约束和唯一索引的区别的文章就介绍到这了,更多相关GBase 8s数据库主键内容请搜索悠久资源以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源!