說明
緊接在欄位的數據類型規格之後,在 ALTER TABLE 或 CREATE TABLE 語句的欄位定義子句中,使用單一欄位條件之語法。
只要在 ALTER TABLE 或 CREATE TABLE 語句的欄位定義子句之外使用保留字 CONSTRAINT,就可以使用多重欄位條件之語法。
使用 CONSTRAINT,可以將欄位設計為如下的條件類型之一:
可以使用 UNIQUE 保留字將欄位設計為唯一鍵。這意味著在同一個表中沒有兩個記錄的這個欄位的值是相同的。可以強制任何欄位或欄位列表為唯一的。如果多重欄位條件被設計成唯一鍵,在索引之中的所有欄位的組合值必須也是唯一的,即使在這些欄位之中有兩個或兩個以上的記錄有相同的值。
可以用 PRIMARY KEY 保留字,將表中的欄位或一組欄位設計為主鍵。在主鍵之中所有的值必須是唯一的,且不可為 Null,一個表只能有一個主鍵。
注意 在一個已經設有主鍵的表中,不能再設定 PRIMARY KEY 條件,否則會發生錯誤。
您可以使用 FOREIGN KEY 保留字將一個欄位設定為外部鍵。如果外部表的主鍵是由一個以上的欄位所組成,則必須使用多重欄位條件定義,列出全部的引用欄位、外部表名、以及以列出引用欄位相同的順序在外部表中列出引用欄位的名稱。若所引用的欄位是外部表的主鍵,則無須指定所引用的欄位。根據默認,資料庫引擎在認為外部表的主鍵是所引用欄位的情況下執行操作。
外部鍵條件限定具體的活動在一個相應的主鍵值被改變時來執行:
你可以指定外部表上執行的活動,此活動基於一個在定義了CONSTRAINT的表中主鍵上執行的相應的活動。例如,考慮以下對“客戶”表的定義
CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
考慮表的以下定義,定義外部鍵與Customers表的主鍵關係的順序為:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE
ON UPDATE CASCADE 和 ON DELETE CASCADE 子句都定義於外部鍵上。 ON UPDATE CASCADE 子句的含義是:如果用戶的標識符(CustId)在用戶表中更新,此更新將通過順序表級聯。各個含有相套用戶標識符值的順序隨著新值自動更新。 ON DELETE CASCADE 子句的含義是:如果一個用戶被從用戶表中刪除,順序表中所有包含同樣用戶標識符值的位序也會被刪除。
考慮到表中下列不同的定義,用 SET NULL 活動代替CASCADE活動的順序為:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL
ON UPDATE SET NULL 子句的含義是:如果用戶的標識符 (CustId) 在用戶表中更新,順序表中相應的外部鍵值將會被自動設為 NULL。相似地,ON DELETE SET NULL 子句的含義是:如果一個用戶被從用戶表中刪除,順序表中所有相應的外部鍵將會被自動設為NULL。
為阻止外部鍵索引的自動生成,可使用變址器 NO INDEX。這一形式的外部鍵定義僅用於經常要複製形成索引值的情況。在外部鍵索引中的數值經常被複製的場合,使用索引不如直接進行表搜尋有效。對這種索引和表中插入和刪除的行列的維護會降低性能,沒有任何好處。
約束類型
一共有幾種約束類型:
主鍵約束
要對一個列加主鍵約束的話,這列就必須要滿足的條件就是分空
因為主鍵約束:就是對一個列進行了約束,約束為(非空、不重複)
以下是代碼要對一個列加主鍵,列名為id,表名為emp
格式為:
alter table 表格名稱 add constraint 約束名稱 增加的約束類型 (列名)
例子:
alter table emp add constraint ppp primary key (id)
————————————————————————————————
check約束
就是給一列的數據進行了限制
比方說,年齡列的數據都要大於20的
表名(emp) 列名(age)
格式:
alter table 表名稱 add constraint 約束名稱 增加的約束類型 (列名)
例子:
alter table emp add constraint xxx check(age>20)
______________________________________________________________________
unique約束
這樣的約束就是給列的數據追加的不重複的約束類型
格式:
alter table 表名 add constraint 約束名稱 約束類型(列名)
比方說可以給ename列加個unique,讓ename列的數據不重複
例子:
alter table emp add constraint qwe unique(ename)
————————————————————————————————
默認約束
意思很簡單就是讓此列的數據默認為一定的數據
格式:
alter table 表名稱 add constraint 約束名稱 約束類型 默認值) for 列名
比方說:emp表中的gongzi列默認為10000
alter table emp add constraint jfsd default 10000 for gongzi
————————————————————————————————
外鍵約束
這個有點難理解了,外鍵其實就是引用
因為主鍵實現了實體的完整性,
外鍵實現了引用的完整性,
套用完整性規定,所引用的數據必須存在!
其實就是個引用,
比方說一個表名稱叫dept 裡面有2列數據 一列是ID一列是ENAME
id:表示產品的編號
ename:表示產品的名稱
另外一個表格名稱是emp 裡面有2列數據,一列是ID 一列是DID
id:表示用戶號
did:表示購買的產品號
要讓emp表中的did列去引用dept表中的id
可以用下面的方法
格式:
alter table 表名 add constraint 約束名稱 約束類型 (列名) references 被引用的表名稱 (列名)
例子:
alter table emp add constraint jfkdsj foreign key (did) references dept (id)