SQL 基本觀念:外鍵(Foreign Key)約束條件

因為受到了在關聯式資料庫設定外鍵(Foreign key)的約束,在刪除資料的時候失敗,由於自己常常忘記這基本的東西,常常每次寫完又回來改約束的設定,所以紀錄一下,增加自己的印象。

約束範圍

約束的用法在設定外鍵時後面加上 ON UPDATEON DELETE,通常都是用到 ON DELETE 比較多。

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
);

CREATE TABLE child (
id INT,
parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
);

約束規則

RESTRICT (Mysql 預設)

當父表 update/delete 時,如有對應子表資料,則不允許 update/delete

CASCADE

在父表上 update/delete 時,同步 update/delete 子表

SET NULL

在父表上 update/delete 時,將子表上的欄位設為 null (要注意此外鍵不能為 not null)

NO ACTION

與 RESTRICT 相同,功能為 延遲檢查,但在 Mysql 中 NO ACTION 與 RESTRICT 都是為立即檢查約束。

參考