eg.一個用戶可有擁有多個訂單,一個訂單隻能屬於一個用戶,一對多,在tb_order中使用外鍵user_id關聯tb_user的id。 當刪除、更新tb_user中的主鍵時,與之關聯的tb_order要受到影響,比如 #tb_user中的一條記錄 1 chy abcd #tb_order中一條記錄, ...
eg.一個用戶可有擁有多個訂單,一個訂單隻能屬於一個用戶,一對多,在tb_order中使用外鍵user_id關聯tb_user的id。
當刪除、更新tb_user中的主鍵時,與之關聯的tb_order要受到影響,比如
#tb_user中的一條記錄 1 chy abcd #tb_order中一條記錄,10是tb_order的id,1是所屬user的id 10 ...... 1
刪除tb_user中id=1這條記錄,或者更新id欄位的值,mysql會如何處理tb_order中與之關聯的記錄?
設計外鍵時,mysql提供了4種外鍵關聯策略
1、RESTRICT 限制(預設策略)
要刪除tb_user中的記錄,或者更新主鍵欄位的值,如果tb_order中有記錄與之關聯,則不能刪除、更新(執行操作時會報錯)
2、CASCADE 級聯
刪除tb_user中的記錄時,會自動刪除tb_order中與之關聯的記錄;
修改tb_user中id欄位的值時,會自動修改tb_order中與之關聯的記錄的外鍵欄位的值(同步變化)。
3、NO ACTION 什麼也不做
刪除tb_user中的記錄,或者修改id欄位的值,但tb_order中有記錄與之關聯,可以刪除、更新,tb_order中與之關聯的記錄不作任何處理(數據不發生變化)。
此種策略需要存儲引擎支持,如果存儲引擎不支持,會自動換為RESTRICT。
4、SET NULL 置為NULL
刪除tb_user的記錄,或更新主鍵欄位的值,會自動將tb_order中與之關聯的記錄的外鍵欄位的值置為NULL。
這種方式有一個要求:設計tb_order時,外鍵user_id不能使用NOT NULL約束。
CASCADE用得最多,其次是RESTRICT,未設置外鍵關聯策略時預設為RESTRICT(為了數據安全)。