在項目中,很多時候我們建數據表單的時候,兩個表示相關聯的,並且一個表裡面的數據是完全依賴另一張表的數據的,
外鍵約束語法
[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中的某個商品,有相冊數據的時候,不允許刪除該商品;
其中,在添加外鍵約束的時候,有幾點要注意:
一、添加外鍵的字段必須先建立索引;
二、當數據表中有數據的時候,可能導致添加外鍵約束失敗