在MySQL中,當爲表添加外鍵約束時,可以指定在刪除或更新父表記錄時的行爲。下面進行總結:
-
CASCADE
:當父表中的記錄被刪除或更新時,自動刪除或更新子表中相關聯的記錄。這意味着如果父表中的記錄被刪除,那麼相應的子表中與之關聯的記錄也會被刪除。 -
SET NULL
:當父表中的記錄被刪除或更新時,子表中的外鍵列會被設置爲NULL
。這意味着如果父表中的記錄被刪除,子表中的外鍵列將會被置空。 -
SET DEFAULT
:當父表中的記錄被刪除或更新時,子表中的外鍵列會被設置爲默認值。這意味着如果父表中的記錄被刪除,子表中的外鍵列將會被設置爲預先定義的默認值。 -
NO ACTION
:當父表中的記錄被刪除或更新時,不採取任何動作。這意味着如果存在父表和子表之間的關聯,但是父表中的記錄被刪除或更新時,在子表中不會發生任何變化,操作將會被拒絕。 -
RESTRICT
: 當嘗試刪除或者更新父表中有關聯子表數據時,如果子表中存在對應的外鍵關聯數據,則不允許操作父表數據
這些選項可以根據實際需求來選擇,以確保數據的完整性和一致性。
其中,RESTRICT我再詳細說明一下其作用如下:
-
DELETE RESTRICT:當嘗試刪除父表中有關聯子表數據時,如果子表中存在對應的外鍵關聯數據,則不允許刪除父表數據,會拋出一個錯誤。這樣可以確保數據的完整性,避免因刪除父表數據而導致子表數據無法正確關聯。
-
UPDATE RESTRICT:當嘗試更新父表中被外鍵引用的列的值時,如果子表中存在對應的外鍵關聯數據,則不允許更新父表數據,會拋出一個錯誤。這也是爲了保證數據的完整性,防止因更新父表數據而導致子表數據關聯出現問題。
實例
- 建立兩張表user_info和user_ext,然後user_ext中的user_id是user_info的id的外鍵,並使用restrict方式,如果要更新或者刪除user_info中的數據時,保護了user_ext已經引用的數據。
CREATE TABLE `user_info` (
`id` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
CREATE TABLE `user_ext` (
`id` int(11) NOT NULL,
`user_id` int(11) DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `user_id`(`user_id`) USING BTREE,
CONSTRAINT `user_ext_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user_info` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
當刪除主表數據(user_ext中已經存在引用的數據),會出現這個提示,不讓你刪除主表數據,要想刪除,需要先刪子表的纔行
當然,如果希望在刪除主鍵數據時,同時自動將子表數據刪除,就可以在配置外鍵時,選擇cascade即可