主鍵約束
第一範式要求每張表都要有主鍵,因此主鍵約束是非常重要的,而且主鍵約束是外鍵關聯的基礎條件。主鍵約束為表之間的關聯提供了鏈接點。
主鍵必須能夠唯一標識一條記錄,也就是主鍵字段中的值必須是唯一的,而且不能包含NULL 值。從這種意義上來說,主鍵約束是UNIQUE 約束和非空約束的組合。雖然一張表中可以有多個UNIQUE 約束和非空約束,但是每個表中卻只能有一個主鍵約束。在CREATE TABLE語句中定義主鍵約束非常簡單,和UNIQUE 約束和非空約束非常類似,只要在字段定義後添加PRIMARY KEY關鍵字即可。不過在DB2中,主鍵列也必須顯式的定義為NOT NULL。下面的代碼創建了員工信息表,並且將字段FNumber 設置為主鍵字段:
MYSQL、MSSQLServer:
CREATE TABLE T_Person (FNumber VARCHAR(20) PRIMARY KEY,FName VARCHAR(20),FAge INT)
Oracle:
CREATE TABLE T_Person (FNumber VARCHAR2(20) PRIMARY KEY,FName VARCHAR2(20),FAge NUMBER (10))
DB2:
CREATE TABLE T_Person (FNumber VARCHAR(20) NOT NULL PRIMARY KEY,FName VARCHAR(20),FAge INT)
創建完T_Person表後,請執行下面的SQL語句預置一些初始數據到T_Person表中:
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 ( "3" , "sunny", 22);
由於表T_Person 中已經存在FNumber 等於3 的值了,所以執行上邊的SQL 語句後數
據庫系統會報出如下的錯誤信息:
- 違反了 PRIMARY KEY 約束"PKT_Person2E1BDC42"。不能在對象 "dbo.T_Person" 中插入重復鍵。
現在可以刪除T_Person表了:
DROP TABLE T_Person;
除了這種由單一字段組成的主鍵之外,還可以由多個字段來組成主鍵,這樣的主鍵被稱為復合主鍵或者聯合主鍵。復合主鍵的定義和復合唯一約束的定義類似,下面的SQL 語句用來創建員工信息表,並且將字段FNumber 和FName設置為復合主鍵:
MYSQL、MSSQLServer:
CREATE TABLE T_Person (FNumber VARCHAR(20),FName VARCHAR(20),FAge INT,CONSTRAINT pk_1 PRIMARY KEY(FNumber,FName))
Oracle:
CREATE TABLE T_Person (FNumber VARCHAR2(20)FName VARCHAR2(20),FAge NUMBER (10) ,CONSTRAINT pk_1 PRIMARY KEY(FNumber,FName))
DB2:
CREATE TABLE T_Person (FNumber VARCHAR(20) NOT NULL,FName VARCHAR(20) NOT NULL,FAge INT,CONSTRAINT pk_1 PRIMARY KEY(FNumber,FName))
盡管在創建表的時候就定義主鍵是一個好的習慣,但是如果表創建了時候沒有定義主鍵,那麽也可以在以後添加主鍵,其添加方式與添加UNIQUE 約束類似,也就是使用ALTER TABLe語句。不過通過這種方式添加主鍵的時候有一個附加條件,那就是組成主鍵的字段必須包含NOT NULL約束。如果在沒有添加非空約束的字段上創建主鍵,系統將會爆出錯誤信息。
首先創建一個沒有主鍵的T_Person 表,註意其中的字段FNumber 和FName 添加了非空約束:
MYSQL、MSSQLServer:
CREATE TABLE T_Person (FNumber VARCHAR(20) NOT NULL,FName VARCHAR(20) NOT NULL,FAge INT)
Oracle:
CREATE TABLE T_Person (FNumber VARCHAR2(20) NOT NULL,FName VARCHAR2(20) NOT NULL,FAge NUMBER (10))
DB2:
CREATE TABLE T_Person (FNumber VARCHAR(20) NOT NULL,FName VARCHAR(20) NOT NULL,FAge INT)
可以執行下面的SQL語句為T_Person創建主鍵約束:
ALTER TABLE T_Person ADD CONSTRAINT pk_1 PRIMARY KEY(FNumber,FName)
最後刪除主鍵約束的方式與刪除UNIQUE 約束以及CHECK 約束的方式相同,只要使
用帶有DROP子句的ALTER TABLE 語句即可:
ALTER TABLE T_Person
DROP CONSTRAINT pk_1;
這個語句在MYSQL中無效,在MYSQL中要執行下面的SQL語句才能刪除主鍵:
ALTER TABLE T_Person
DROP PRIMARY KEY;
主鍵約束