mysql中外鍵的定義、作用、添加和刪除

1:簡介
在實際開發的項目中,一個健壯數據庫中的數據一定有很好的參照完整性。例如學生檔案和成績單兩張表,如果成績單中有張三的成績,學生檔案中張三的檔案卻被刪除了,這樣就會產生垃圾數據或者錯誤數據。爲了保證數據的完整性,將兩張表之間的數據建立關係,因此就需要在成績表中添加外鍵約束。

2:外鍵的定義
外鍵是指引用另外一個表中的一列或多列數據,被引用的列應該具有主鍵約束或者唯一性約束。外鍵用來建立和加強兩個表數據之間的連接。

3:材料準備

班級表:
	create table grade(
    -> id int(4) not null primary key,
    -> name varchar(36)
    -> );
學生表:    
    create table student (
    -> sid int(4) not null primary key,
    -> sname varchar(36),
    -> gid int(4) not null
    -> );

首先建立兩張表,student、grade,學生表中的gid是學生所在的班級id,是引入了班級表grade中的主鍵id,那麼gid就可以作爲表student表的外鍵。被引用的表grade是主表,引用外鍵的表student是從表。兩個表是主從關係。表student用gid可以連接表grade中的信息,從而建立了兩個表中的連接。可以這麼理解,外鍵即依賴關係,可以明確的聲明表和表之間的關係額字段的參照關係,這種就叫做表和表之間聲明瞭一個外鍵。
注意:引入外鍵之後,外鍵列只能插入參照列存在的值,參照列被參照的值不能被刪除,這就保證了數據的參照完整性。

4:添加外鍵

語法格式:
alert table 表名 add constraint FK_ID foreign key(外鍵字段名) references 外表表名(主鍵字段名)
其中FK_ID爲外鍵的名稱,是隨意的。
爲表student添加外鍵約束,具體語句如下:
mysql> alter table student add constraint FK_ID foreign key gid references grade id;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'references grade id' at line 1
mysql> alter table student add constraint FK_ID foreign key (gid) references grade (id);
Query OK, 0 rows affected (1.27 sec)

5:驗證外鍵的作用:

mysql> insert into student (sid, sname, gid) values(1000, 'wusong', 123);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`student`, CONSTRAINT `FK_ID` FOREIGN KEY (`gid`) REFERENCES `grade` (`id`))
上述錯誤表示,若要向student中插入學生數據,則必須插入已經在grade中存在的gid值,實際意義就是要把新來的學生放入某個班級,則班級必須先存在。

6:外鍵關聯表聯合刪除
建立外鍵是爲了保證數據的完整和統一性,但如果主表中的數據被刪除或修改,從表中的數據該怎麼辦?很明顯應該刪除,否則數據庫中會存在很多無意義的垃圾數據。爲此,MySQL可以在建立外鍵時添加ON DELETE或ON UPDATE子句來告訴數據庫,怎樣避免垃圾數據的產生。

alter table 表名 add constraint FK_ID foreign key (外鍵字段名) references 外表表名 (主鍵字段名)
[on delete {cascade | set null | no action| restrict}]
[on update {cascade | set null | no action| restrict}]
其中restrict是默認操作,表示拒絕主表刪除或修改外鍵關聯列,這是最安全的設置。
而cascade表示刪除包含與已刪除鍵值有參考關係的所有記錄。

7:刪除外鍵約束

在實際開發中,根據業務邏輯的需求,需要解除兩個表之間的關聯關係時,就需要刪除外鍵約束。刪除外鍵約束的語法如下:
alter table 表名 drop foreign key 外鍵名;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章