參照完整性的本質
- 通過添加一張父表的形式,給當前操作的表(子表)添加一個約束(字典)。
即:要求子表的某字段(外鍵),必須在父表的對應字段范圍內取值(即寫的字,一定要是字典里有的)。
- 約定了父表進行刪除(on delete)或修改(on update)的時候,子表如何保持約束有效(嚴格/級聯/不動作/設空/設默認值)。
即:改變字典的內容時,文章里對應的字將如何變化。
通常設置 [嚴格(默認)/級聯/設空/設默認值],對應關鍵字(無/cascade/set null/set default),含義為(禁止修改字典/文章里的字跟着改/文章里的字設為空/文章里的字設為默認值)
設置參照完整性后,對兩表的一切操作,都應滿足上面第一點的描述,且按照第二點的規則工作。
定義參照完整性
思想:
- 子表中選出一列做外鍵(默認會被添加普通索引),跟父表的索引(主鍵或唯一)關聯。
- 可以起個名字,最好起個名字。(默認的名字不直觀)
- 可以設置父表的刪改規則,不指定默認“嚴格”。
語法:
- 完整寫法舉例
CONSTRAINT xh1 FOREIGN KEY (xh) REFERENCES t1(xh) ON DELETE cascade ON UPDATE cascade
含義:把當前表的xh字段和t1表的xh字段關聯,起個名字叫xh1,刪除規則是級聯,更新規則是級聯。
- 最簡寫法舉例
FOREIGN KEY (xh) REFERENCES t1(xh)
含義:把當前表的xh字段和t1表的xh字段關聯,名字是mysql亂起的,刪除規則是嚴格,更新規則是嚴格。
使用:
可以把上面參照完整性的內容,當作字段,在創建表(create table)或修改表(alter table)的命令里使用。
如
CREATE TABLE t2 (xh char(1) DEFAULT NULL,km varchar(2) DEFAULT NULL,cj int DEFAULT NULL, KEY xh (xh),CONSTRAINT xh FOREIGN KEY (xh) REFERENCES t1 (xh))
或
alter table t2 add CONSTRAINT xh FOREIGN KEY (xh) REFERENCES t1(xh) ON DELETE cascade ON UPDATE cascade;
刪除的時候必須用到名字
alter table t2 drop CONSTRAINT xh;
小技巧:對於系統的自動命名,可以通過顯示建表命令來查看名稱。
如
show create table t1;
示例:
t1為基本情況表,t2為成績表
內容:
借助t1的xh字段,為t2的xh字段添加參照完整性規則:
alter table t2 add FOREIGN KEY (xh) REFERENCES t1(xh);
這是“默認命名”的“嚴格”規則。運行結果:
t2的xh字段在此時也被自動添加了普通索引:
分別嘗試修改t2的最后一條記錄和t1的最后一條記錄,把學號改為'4',可以看到修改被拒絕:
在提示中,也可以看到系統給出的默認約束名稱:t2_ibfk_1。
把修改和刪除規則改為級聯。思想:刪除,添加新的規則:
修改父表時,可以看到子表內容也被修改: