萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MYSQL外鍵約束的學習筆記

MYSQL外鍵約束的學習筆記

MySQL有兩種常用的引擎類型:MyISAM和InnoDB。目前只有InnoDB引擎類型支持外鍵約束了,所以我們如果要做外鍵約束就必須是InnoDB引擎了。


在項目中,很多時候我們建數據表單的時候,兩個表示相關聯的,並且一個表裡面的數據是完全依賴另一張表的數據的,

外鍵約束語法


[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION  外鍵的使用需要滿足下列的條件:

  1. 兩張表必須都是InnoDB表,並且它們沒有臨時表。

  2. 建立外鍵關系的對應列必須具有相似的InnoDB內部數據類型。

  3. 建立外鍵關系的對應列必須建立了索引。

  4. 假如顯式的給出了CONSTRAINT symbol,那symbol在數據庫中必須是唯一的。假如沒有顯式的給出,InnoDB會自動的創建。


例如:表1:rou_products,表2:rou_pro_images;

ru_products(id,….)是商品信息表,ru_pro_images(id,pro_id,…)是商品相冊表;ru_products與ru_pro_images是1:N關系;


現在的要求是,當刪除一個商品時,該商品的所有相冊數據全部刪掉,有兩種方式:
方式一:在代碼中實現,刪除delete from ru_products … 之前先select 該條數據的id,然後根據這個id,刪除ru_images表中
pro_id = id 的數據;
方式二:在 create  table  ru_images的時候,建立外鍵約束,這樣,在刪除表ru_products的時候,數據庫會自動幫我們把ru_images中與ru_products表中刪除的對應數據刪除掉;這樣,不僅節省代碼、減少工作量,更能保障數據一致性

建議外鍵約束具體的操作方式是:

1、建立pro_id字段的索引:ALTER TABLE

ru_images
ADD INDEX(pro_id);//如果pro_id已經添加索引,請忽略此步驟;

2、建議外鍵約束:ALTER TABLE

ru_images
ADD CONSTRAINT fk_pro_img FROEIGN KEY(pro_id) REFERENCES
ru_products
(id) ON DELETE CASCADE;
其中 ON DELETE CASCADE 表示當刪除ru_products的時候,級聯對ru_images進行刪除;當然,這裡還有其他選項可選擇:
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]

CASCADE 表示級聯操作;SET NULL 表示置空;NO ACTION 表示不進行任何操作;RESTRICT 表示當ru_products中的某個商品,有相冊數據的時候,不允許刪除該商品;

其中,在添加外鍵約束的時候,有幾點要注意:

一、添加外鍵的字段必須先建立索引;
二、當數據表中有數據的時候,可能導致添加外鍵約束失敗

copyright © 萬盛學電腦網 all rights reserved