1. 程式人生 > >唯一約束

唯一約束

rain 員工信息 應用 arc const into not 相關 name

唯一約束又稱為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;

唯一約束