唯一约束

唯一约束又称为UNIQUE约束,它用于防止一个特定的列中两个记录具有一致的值,比如在员工信息表中希望防止两个或者多个人具有相同的身份证号码。唯一约束分为单字段唯一约束与复合唯一约束两种类型,下面分别介绍。

如果希望一个字段在表中的值是唯一的,那么就可以将唯一约束设置到这个字段上,设置方式就是在字段定义后增加UNIQUE,如果是DB2,那么还要同时将NOT NULL约束设置到这个字段上。下面的SQL语句创建了表T_Person,并且将唯一约束设置到FNumber字段上:


MYSQL、MSSQLServer:

CREATE TABLE T_Person (FNumber VARCHAR(20) UNIQUE,FName VARCHAR(20),FAge INT)

Oracle:

CREATE TABLE T_Person (FNumber VARCHAR2(20) UNIQUE,FName VARCHAR2(20),FAge NUMBER (10))

DB2:

CREATE TABLE T_Person (FNumber VARCHAR(20) NOT NULL UNIQUE,FName VARCHAR(20),FAge INT)

创建 T_Person表后我们执行下面的SQL语句向数据库中插入初始的一些测试数据:


INSERT INTO T_Person (FNumber, FName, FAge) VALUES ( "1" , "kingchou", 20);

INSERT INTO T_Person (FNumber, FName, FAge) VALUES ( "2" , "stef", 22);

INSERT INTO T_Person (FNumber, FName, FAge) VALUES ( "3" , "long", 26);

INSERT INTO T_Person (FNumber, FName, FAge) VALUES ( "4" , "yangzk", 27);

INSERT INTO T_Person (FNumber, FName, FAge) VALUES ( "5" , "beansoft", 26);

执行完毕后就能在表T_Person中的看到下面的数据:


FNUMBER FNAME FAGE

1 kingchou 20

2 stef 22

3 long 26

4 yangzk 27

5 beansoft 26

接着执行下面的SQL语句进行测试:


INSERT INTO T_Person (FNumber, FName, FAge) VALUES ( "2" , "kitty", 20)

在数据库中执行此SQL语句后数据库会报出下面错误信息:

  • 违反了 UNIQUE KEY 约束 "UQT_Person1A14E395"。不能在对象 "dbo.T_Person" 中插入重复键。

单字段唯一约束的相关知识就介绍到这里,请执行下面的SQL语句将T_Person表删除:


DROP TABLE T_Person

唯一约束可以添加到多个字段中,也就是一张表中的唯一约束可以有不止一个,但是这样的单字段唯一约束只能约束“字段A 的值在表中不重复”、“字段B的值在表中不重复”等,却不能约束“字段A的值在表中可以重复,字段B的值在表中也可以重复,但是不能存在字段A的值和字段B的值同时重复的记录”,这种约束也是有应用场景的:公司中每个部门单独进行工号编号,而且每个部门拥有唯一的部门编号,这样每个员工所属的部门编号是可以在表内重复的,而且每个员工的工号也是可以在表内重复的,但是不能存在所属的部门编号和每个员工的工号同时重复的员工。复合唯一约束是建立在多个字段上的约束,被约束的字段在不能同时重复。

定义复合唯一约束需要定义在所有字段列表之后,语法如下:


CONSTRAINT 约束名UNIQUE(字段1,字段2……字段n)

这里的“字段1,字段2……字段n”为组成约束的多个字段,如果只有一个字段则可以看做是单字段唯一约束定义的另外一种形式。通过这种形式定义的唯一约束由于有一个确定的名称,所以可以很容易的通过这个名字来删除这个约束。

下面的SQL语句创建了表T_Person,并且将在部门编号字段FDepartmentNumber 和工号字段FNumber 上设置复合唯一约束,并且命名为unic_dep_num:


MYSQL、MSSQLServer:

CREATE TABLE T_Person (FNumber VARCHAR(20),FDepartmentNumber VARCHAR(20),FName VARCHAR(20),FAge INT,CONSTRAINT unic_dep_num UNIQUE(FNumber,FDepartmentNumber))

Oracle:

CREATE TABLE T_Person (FNumber VARCHAR2(20),FDepartmentNumber VARCHAR(20),FName VARCHAR2(20),FAge NUMBER (10),CONSTRAINT unic_dep_num UNIQUE(FNumber,FDepartmentNumber))

DB2:

CREATE TABLE T_Person (FNumber VARCHAR(20) NOT NULL,FDepartmentNumber VARCHAR(20) NOT NULL,FName VARCHAR(20),FAge INT,CONSTRAINT unic_dep_num UNIQUE(FNumber,FDepartmentNumber))

创建T_Person表后我们执行下面的SQL语句向数据库中插入初始的一些测试数据:


INSERT INTO T_Person (FNumber, FDepartmentNumber,FName, FAge)VALUES ( "1" , "dev001","kingchou", 20);

INSERT INTO T_Person (FNumber, FDepartmentNumber,FName, FAge)VALUES ( "2" , "dev001", "stef", 22);

INSERT INTO T_Person (FNumber, FDepartmentNumber,FName, FAge)VALUES ( "1" , "sales001", "long", 26);

INSERT INTO T_Person (FNumber, FDepartmentNumber,FName, FAge)VALUES ( "2" , "sales001", "yangzk", 27);

INSERT INTO T_Person (FNumber, FDepartmentNumber,FName, FAge)VALUES ( "3" , "sales001", "beansoft", 26);

执行完毕后就能在表T_Person中的看到下面的数据:


FNumber FDepartmentNumber FName FAge

1 dev001 kingchou 20

2 dev001 stef 22

1 sales001 long 26

2 sales001 yangzk 27

3 sales001 beansoft 26

可以看到FNumber和FDepartmentNumber字段的值在表中都有重复的值,但是没有这两个字段同时重复的值,如果这两个字段同时重复的话执行就会失败,执行下面的SQL语句来验证一下:


INSERT INTO T_Person (FNumber, FDepartmentNumber,FName, FAge) VALUES ( "2" , "sales001", "daxia", 30);

因为FNumber等于"2"且FDepartmentNumber等于"sales001"的记录在表中已经存在了,所以在数据库中执行此SQL语句后数据库会报出下面错误信息:

  • 违反了 UNIQUE KEY 约束 "unic_dep_num"。不能在对象 "dbo.T_Person" 中插入重复键。

为了运行后面的例子,请首先将表T_Person删除:DROP TABLE T_Person。

可以在一个表中添加多个复合唯一约束,只要为它们指定不同的名称即可。下面的SQL语句创建表T_Person,并且为字段FNumber和FDepartmentNumber创建一个复合唯一约束以及为FDepartmentNumber和FName创建一个复合唯一约束:


MYSQL、MSSQLServer:

CREATE TABLE T_Person (FNumber VARCHAR(20),FDepartmentNumber VARCHAR(20),FName VARCHAR(20),FAge INT,CONSTRAINT unic_1 UNIQUE(FNumber,FDepartmentNumber),CONSTRAINT unic_2 UNIQUE(FDepartmentNumber, FName))

Oracle:

CREATE TABLE T_Person (FNumber VARCHAR2(20),FDepartmentNumber VARCHAR(20),FName VARCHAR2(20),FAge NUMBER (10) ,CONSTRAINT unic_1 UNIQUE(FNumber,FDepartmentNumber),CONSTRAINT unic_2 UNIQUE(FDepartmentNumber, FName))

DB2:

CREATE TABLE T_Person (FNumber VARCHAR(20) NOT NULL,FDepartmentNumber VARCHAR(20) NOT NULL,FName VARCHAR(20) NOT NULL,FAge INT NOT NULL,CONSTRAINT unic_1 UNIQUE(FNumber,FDepartmentNumber) ,CONSTRAINT unic_2 UNIQUE(FDepartmentNumber, FName))

到目前为止,我们已经讲了如何在创建数据表的时候创建唯一约束了,可是有时我们需要在已经创建好的数据表上添加新的唯一约束,这时就需要使用ALTER TABLE 语句了,使用它我们可以为一张已经存在的数据表添加新的约束,语法如下:


ALTER TABLE 表名ADD CONSTRAINT 唯一约束名UNIQUE(字段1,字段2……字段n)

比如下面的SQL语句为T_Person表添加一个建立在字段FName和字段FAge上的新的唯一约束:


ALTER TABLE T_Person ADD CONSTRAINT unic_3 UNIQUE(FName, FAge)

同样ALTER TABLE语句我们也可以删除已经创建好的复合唯一约束,语法如下:


ALTER TABLE 表名DROP CONSTRAINT 唯一约束名

不过上边的语法不能在MYSQL中执行,MYSQL中删除约束的语法为:


ALTER TABLE 表名DROP INDEX 唯一约束名

比如下面的SQL语句将刚才创建的三个复合唯一约束删除:


MSQLServer、Oracle、DB2:

ALTER TABLE T_Person DROP CONSTRAINT unic_1;

ALTER TABLE T_Person DROP CONSTRAINT unic_2;

ALTER TABLE T_Person DROP CONSTRAINT unic_3;

MYSQL:

ALTER TABLE T_Person DROP INDEX unic_1;

ALTER TABLE T_Person DROP INDEX unic_2;

ALTER TABLE T_Person DROP INDEX unic_3;

原文地址:https://www.cnblogs.com/yuyu666/p/9823695.html

时间: 2024-10-13 23:15:44

唯一约束的相关文章

oracle数据库添加,查询,删除唯一约束

UNIQUE约束称之为唯一约束,可以设置在表中输入的字段值都是唯一的,跟主键很相似,不同的是唯一约束可以有多个,主键只能有一个对于不是主键但要保证唯一性的字段来说,可以建议唯一约束 (1)添加唯一约束 [1]创建表的同时添加唯一约束 创建表时添加UNIQUE约束,在创建表的后面 语法: CONSTRAINT   约束名称   UNIQUE(字段名) 示例: CREATE TABLE ORDERINFO (              ORDERID VARCHAR2(10),           

组合唯一约束

UNIQUE约束要求,对于列或列组合而言,表中每行的值必须是不同的.UNIQUE约束的怪异之处在于,可以在键列输入NULL值.在键列中,可能有任意数量的包含NULL值得行.UNIQUE约束通过索引来实施.在定义UNIQUE约束时,Oracle将查看键列上的索引,如果不存在,就创建一个.索引(称为B*树索引)的结构不包含NULL值,正因为如此,才允许出现多个包含null的行.选择 WHERE key_column is NULL不使用索引(因为索引不包含NULL),因此总是导致扫描整个表. 所以说

14-SQLite之主键与唯一约束

一.主键 惟一地标识一行(一张表中只能有一个主键) 主键应当是对用户没有意义的(常用于索引) 永远不要更新主键,否则违反对用户没有意义原则 主键不应包含动态变化的数据,如时间戳.创建时间列.修改时间列等 在两个表的关系中,主关键字用来在一个表中引用来自于另一个表中的特定记录 语法: create table 表名称 (列名称1 数据类型 primary key, 列名称2 数据 类型,列名称3 数据类型, ...); 二.唯一约束 用来保证一个列(或一组列)中数据唯一,类似于主键,但跟主键有区别

【INDEX】Oracle中主键、唯一约束与唯一索引之区别

一.            概述一般在Oracle数据表中,我们都会看到主键,索引,也会看到唯一索引.唯一约束,那么他们有什么区别呢,下面通过一个小实验简单了解一下....http://www.shejiben.com/images/list/1379589/ http://www.shejiben.com/images/list/1379588/ http://www.shejiben.com/images/list/1379587/ http://www.shejiben.com/image

NULL和唯一约束UNIQUE的对应关系

NULL和唯一约束UNIQUE的对应关系 在数据库中,NULL表示列值为空.唯一约束UNIQUE规定指定列的值必须是唯一的,值和值之间都不能相同.这个时候,就出现一个问题,NULL和NULL算是相同,还是不同.由于SQL语法没有明确规定,所以各个数据库厂商的处理方式不同. (1)PostgreSQL和Oracle认为NULL表示没有指定数据,所以数据有多种可能,所以UNIQUE约束列中允许存在任意个NULL. (2)Informix和SQL Server认为NULL就表示空,是一种唯一的状态.所

mysql 唯一约束

ALTER TABLE user ADD UNIQUE (username,userid) 对表user增加username和userid的唯一约束 ALTER TABLE tablename  ADD UNIQUE (列名,列名) 约束需要消耗一定的性能,慎用,建议更多的约束逻辑在程序中控制,避免数据库性能瓶颈.自己平衡性能和完整性的取舍.

MySql -- UNIQUE唯一约束

3.UNIQUE 约束 约束唯一标识数据库表中的每条记录. 创建一张测试表: CREATE TABLE `test`.`info`( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `idCard` VARCHAR(18) UNIQUE NOT NULL, -- 直接在字段上添加唯一约束 `mobile` VARCHAR(11), PRIMARY KEY (`id`) ) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8

判断唯一约束是否是唯一的Unique

//检查 唯一约束Name //检查 唯一约束Name int count = new BLL.Funcs().GetRecordCount(string.Format("Name={0}", model.Name)); if (!CheckUniqueFieldByCount(EditID, count, preName, model.Name)) { FineUI.Alert.Show(Resources.WebResource.SaveFailed); return; } //新

Oracle数据库,非空约束、主键约束、外键约束、唯一约束

非空约束:设置列时,可为空默认可为空,去掉对号之后设置数据不可为空: 唯一约束:在键中设置,唯一约束名称.类型Unique.列名:设置应用完成之后,此列数据具有唯一性:即数据不可重复 主键约束:主键列自动具有非空约束和唯一约束,一个表只能有一个主键约束(自动生成索引,提高查询效率)

数据库中创建unique唯一约束

最近项目中的需求,确定唯一一条数据,原来貌似碰到过,忘记了,现在记录一下.实现唯一约束还可以不是主键的unique. oracle中的unique约束是用来保证表中的某一类,或者表中的某一类组合起来不重复的一种手段.我们在可以在创建表时或者创建好后通过修改表的方式来创建oracle中的unique约束. 下面是一些创建unique约束的例子: create table unique_test (id number, fname varchar2(20), lname varchar2(20),