温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

数据库主键约束、唯一约束和唯一索引的区别是什么

发布时间:2022-02-19 13:40:24 来源:亿速云 阅读:371 作者:iii 栏目:开发技术

本篇内容主要讲解“数据库主键约束、唯一约束和唯一索引的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据库主键约束、唯一约束和唯一索引的区别是什么”吧!

主键约束(PRIMARY KEY)

  1. 主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主键,一个表上仅只能有一个主键;

  2. 不建议更新主键;

  3. 主键列上没有任何两行具有相同值(即重复值),且不允许空(NULL);

  4. 主健可作外健,唯一索引不可;

唯一性约束(UNIQUE)

  1. 唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表上可以放置多个唯一性约束;

  2. 只要唯一就可以更新;

  3. 表中任意两行在指定列上都不允许有相同的值,但允许空(NULL);

唯一索引(UNIQUE INDEX)

  1. 唯一索引可以确保任何生成重复键值的尝试都会失败;

  2. 只要唯一就可以更新;

  3. 表中任意两行在指定列上都不允许有相同的值,但允许空(NULL);

唯一性约束和主键约束的区别:

  1. 唯一性约束允许在该列上存在NULL值,而主键约束的限制更为严格,不但不允许有重复,而且也不允许有空值。

唯一约束和唯一索引的区别:

前者是用来检查数据的正确性,后者用来实现数据查询的优化,目的不同。
唯一性约束与唯一索引有所不同:

  • 创建唯一约束会在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

删除约束,对应的索引一并删除。

细心的你,会发现:

  1. 如果字段加上not null约束,再加上唯一约束或者唯一索引,功能上将等同于主键约束;

  2. 唯一约束仅仅比唯一索引多了一个约束;

到此,相信大家对“数据库主键约束、唯一约束和唯一索引的区别是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI