GBase 8s数据库主键约束、唯一约束和唯一索引的区别解析

主键约束(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. 唯一约束仅仅比唯一索引多了一个约束;

到此这篇关于GBase 8s数据库主键约束、唯一约束和唯一索引的区别的文章就介绍到这了,更多相关GBase 8s数据库主键内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • GBase 8s数据库主键约束、唯一约束和唯一索引的区别解析

    主键约束(PRIMARY KEY) 主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主键,一个表上仅只能有一个主键: 不建议更新主键: 主键列上没有任何两行具有相同值(即重复值),且不允许空(NULL): 主健可作外健,唯一索引不可: 唯一性约束(UNIQUE) 唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表上可以放置多个唯一性约束: 只要唯一就可以更新: 表中任意两行在指定列上都不允许有相同的值,但允许空(NULL): 唯一索引(UNIQUE I

  • 浅析GBase8s 唯一索引与非唯一索引问题

    唯一索引在列中不允许重复的值出现,可以用来定义和约束表中的一列或者多列组合值,在执行insert和update语句时需要检查唯一性.GBase8s中主键(PRIMARY KEY)会自动创建一个唯一索引.一个良好的表设计都应该定义主键或者唯一约束索引.特别是在OLTP系统中,唯一索引可以帮助快速定位少量记录. 唯一索引的创建语法: CREATE UNIQUE INDEX idx_name ON tabname(col); 或者 CREATE DISTINCT INDEX idx_name ON t

  • 小议sqlserver数据库主键选取策略

    因为主键可以唯一标识某一行记录,所以可以确保执行数据更新.删除的时候不会出现张冠李戴的错误.当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了.主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致.所以数据库在设计时,主键起到了很重要的作用. 常见的数据库主键选取方式有: 自动增长字段 手动增长字段 UniqueIdentifier "COMB(Combine)"类型 一.自动增长型字段 很多数据库设计者喜欢使用自动增长型字段,因为它使用简单.

  • Navicat设置Oracle数据库主键自增的方法步骤

    目录 一. 创建如下表 二.创建序列 三.创建触发器 总结 一. 创建如下表 Oracle数据库不同于Mysql.Sql Server数据库,Oracle数据库主键自增不能在建表时直接设置,而是需要通过序列和触发器进行设置! 二.创建序列 create sequence SEQ_DEVICEDATAINFO start with 1 increment by 1 maxvalue 99999999 nocycle cache 10; 上述语句中: create sequence SEQ_DEVI

  • sqlserver数据库主键的生成方式小结(sqlserver,mysql)

    主键的生成方式主要有三种: 一. 数据库自动生成 二. GUID 三. 开发创建 严格讲这三种产生方式有一定的交叉点,其定位方式将在下面进行讲解. 第一种方式,主要将其定位在自增长的标识种子:可以设置起始数值,及增长步长.其优点在于使用时完全将并发任务交于数据库引擎管理,你不用担心存在多用户使用的时候会产生两个相同的ID的情况.其缺点也在于此,多数的数据库不提供直接获取标识ID的方式,对于开发人员来说产生ID的方式是透明的,开发人员几乎无法干预此项.对于数据的迁移也不是很方便. 由于存在上面的利

  • java实现数据库主键生成示例

    复制代码 代码如下: package test;import java.util.concurrent.atomic.AtomicInteger; public class IDGenerate {private static final AtomicInteger integer = new AtomicInteger(0);public static long getId() {  long time = System.currentTimeMillis();  StringBuilder

  • 浅谈MYSQL主键约束和唯一约束的区别

    目录 主键约束 唯一约束 主键约束 PRIMARY KRY 主键 是唯一的 一张表只能有一个主键 AUTO_INCREMENT 一定要和主键连用 主键一定是非空的 NOT NULL 特点:不能为空,不重复 ##没有约束 Create table stu0( Id int Name varcahr(50) ) Insert into stu0(name)value("张三丰"): ##方式一:创建表,并且添加主键约束 Create table stu1( Id int primary k

  • SQLServer主键和唯一约束的区别

    首先说明一点,主键又称主键约束,它也是一种约束,看下它和唯一约束的创建语法: alter table Person add constraint PK_Id primary key (Id) alter table Person add constraint UQ_Name unique (Name) 主键和唯一约束都要求字段值唯一,除此外,它们还有如下区别: ·同一张表只能有一个主键,但能有多个唯一约束: ·主键字段值不能为NULL,唯一约束字段值可以为NULL: ·主键字段可以做为其他表的外

  • MySQL中主键为0与主键自排约束的关系详解(细节)

    前言 本文主要介绍了关于MySQL主键为0与主键自排约束的关系,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 开始不设置主键表的设计如下: 如果id的位置有好几个0的话:设置主键并且自动排序时,0会从1开始递增: Insert 进去 id = 0的数据,数据会从实际的行数开始增加,和从0变化不一样: 现在主键是没有0的,如果把某个id改成0的话,0不会变!直接会进行排序: 再insert一个id=0的看看,居然还是跟刚才一样直接跟行数相关! 再重置一下自动排序,看看这个0会不

  • 在Django model中设置多个字段联合唯一约束的实例

    使用Django中遇到这样一个需求,对一个表的几个字段做 联合唯一索引,例如学生表中 姓名和班级 2个字段在一起表示一个唯一记录. Django中model部分的写法, 参见 unique-together 部分文档. class MyModel(models.Model): field1 = models.CharField(max_length=50) field2 = models.CharField(max_length=50) class Meta: unique_together =

  • JDBC插入数据返回数据主键代码实例

    Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法.JDBC也是Sun Microsystems的商标.我们通常说的JDBC是面向关系型数据库的. 代码如下 package com.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Re

随机推荐