[TOC]
*****
約束是一種簡單地強加于表中一列或多列的限制,約束有以下幾種不同的類型。\*\*主鍵約束 \*\*
標志一列或多列,并保證其值在表內的唯一性。**外鍵約束**指該列引用的是其他表的主鍵,在其他表主鍵列進行更新或刪除時要一同更新或刪除。
用外鍵和其他表中的對應主鍵關聯,可以確定其他表中的唯一一條記錄。
**唯一約束**限制一列或多列的值,保證其在表內的唯一性(主鍵約束是一種特殊類型的唯一約束)。
**檢查約束**限制一列的可用值范圍
如果服務器允許只修改 customer表中的客戶 ID 而不改變 account 表中的同一個 ID,那么最終結果就是賬戶不再指向合法的客戶記錄(所謂孤兒行)。不過,有了合適的主鍵和外鍵約束后,服務器就可以在試圖修改或刪除被其他表引用的數據時要么拋出一個錯誤,要么將這些改變傳播到其他表(稍后會作更多討論)
## 13.2.1 創建約束
**創建約束**
指定了 product\_cd 列作為product表的主鍵,還指定了 product\_type\_cd 列作為product\_type 表的外鍵

\*\* 通過 alter table 語句添加主鍵約束和外鍵約束\*\*

**刪除主鍵約束或者外鍵約束**

*****
## 13.2.2 約束與索引

## 13.2.3 級聯約束
有了合適的外鍵約束后,如果插入新行或者修改行而導致表中的外鍵列并不匹配父表中主鍵列的值,那么服務器會拋出一個錯誤。
product\_type是product的父表, product\_type\_cd列在兩表中作為主外鍵。

下面試圖執行的語句:

如果父行沒有相應的值,外鍵約束不允許更改子行
product\_type 表 中 沒 有 哪 一 行 的 product\_type\_cd 列值為 XYZ,所以服務器的更新是不會成功的。
*****

因為 product 表中存在子行的 product\_type\_cd 列值為LOAN,所以不允許父行將LOAN變為XYZ。
**級聯更新**
可以命令服務器幫助父行將主鍵變化傳播到所有子行的外鍵,這樣就保證了數據的完整性。用on update cascade 語句
1. 先刪除原有約束
2. 再增加級聯更新約束

再次執行update語句:

用select看兩張表中的記錄,product\_type 表的改變已經傳播到了 product 表。
**級聯刪除**
如果 product\_type 表中的行被刪除, product 表中的子行也將被刪除

當 product\_type 表中的一行被更新時,服務器將更新 product 表中的子行