mysql~數據完整性考慮~外鍵約束

在MySQL中,當爲表添加外鍵約束時,可以指定在刪除或更新父表記錄時的行爲。下面進行總結:

  1. CASCADE:當父表中的記錄被刪除或更新時,自動刪除或更新子表中相關聯的記錄。這意味着如果父表中的記錄被刪除,那麼相應的子表中與之關聯的記錄也會被刪除。

  2. SET NULL:當父表中的記錄被刪除或更新時,子表中的外鍵列會被設置爲NULL。這意味着如果父表中的記錄被刪除,子表中的外鍵列將會被置空。

  3. SET DEFAULT:當父表中的記錄被刪除或更新時,子表中的外鍵列會被設置爲默認值。這意味着如果父表中的記錄被刪除,子表中的外鍵列將會被設置爲預先定義的默認值。

  4. NO ACTION:當父表中的記錄被刪除或更新時,不採取任何動作。這意味着如果存在父表和子表之間的關聯,但是父表中的記錄被刪除或更新時,在子表中不會發生任何變化,操作將會被拒絕。

  5. RESTRICT: 當嘗試刪除或者更新父表中有關聯子表數據時,如果子表中存在對應的外鍵關聯數據,則不允許操作父表數據

這些選項可以根據實際需求來選擇,以確保數據的完整性和一致性。

其中,RESTRICT我再詳細說明一下其作用如下:

  1. DELETE RESTRICT:當嘗試刪除父表中有關聯子表數據時,如果子表中存在對應的外鍵關聯數據,則不允許刪除父表數據,會拋出一個錯誤。這樣可以確保數據的完整性,避免因刪除父表數據而導致子表數據無法正確關聯。

  2. 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即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章