MySQL有兩種常用的引擎類型:MyISAM和InnoDB,目前只有InnoDB引擎類型支持外鍵約束了,所以我們?nèi)绻鐾怄I約束就必須是InnoDB引擎了.
在項目中,很多時候我們建數(shù)據(jù)表單的時候,兩個表示相關(guān)聯(lián)的,并且一個表里面的數(shù)據(jù)是完全依賴另一張表的數(shù)據(jù)的.
外鍵約束語法:
- [CONSTRAINT [symbol]] FOREIGN KEY
- [index_name] (index_col_name, ...)
- REFERENCES tbl_name (index_col_name,...)
- [ON DELETE reference_option] --Vevb.com
- [ON UPDATE reference_option]
- reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION 外鍵的使用需要滿足下列的條件:
1.兩張表必須都是InnoDB表,并且它們沒有臨時表。
2.建立外鍵關(guān)系的對應列必須具有相似的InnoDB內(nèi)部數(shù)據(jù)類型。
3.建立外鍵關(guān)系的對應列必須建立了索引。
4.假如顯式的給出了CONSTRAINT symbol,那symbol在數(shù)據(jù)庫中必須是唯一的,假如沒有顯式的給出,InnoDB會自動的創(chuàng)建.
例如:表1:rou_products 表2:rou_pro_images;
ru_products(id,….)是商品信息表,ru_pro_images(id,pro_id,…)是商品相冊表;ru_products與ru_pro_images是1:N關(guān)系;
現(xiàn)在的要求是,當刪除一個商品時,該商品的所有相冊數(shù)據(jù)全部刪掉,有兩種方式:
方式一:在代碼中實現(xiàn),刪除delete from ru_products … 之前先select 該條數(shù)據(jù)的id,然后根據(jù)這個id,刪除ru_images表中.pro_id = id 的數(shù)據(jù);
方式二:在 create table ru_images的時候,建立外鍵約束,這樣,在刪除表ru_products的時候,數(shù)據(jù)庫會自動幫我們把ru_images中與ru_products表中刪除的對應數(shù)據(jù)刪除掉,這樣,不僅節(jié)省代碼、減少工作量,更能保障數(shù)據(jù)一致性.
建議外鍵約束具體的操作方式是:
1、建立pro_id字段的索引:ALTER TABLE ru_images ADD INDEX(pro_id);//如果pro_id已經(jīng)添加索引,請忽略此步驟;
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的時候,級聯(lián)對ru_images進行刪除;當然,這里還有其他選項可選擇:
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
CASCADE 表示級聯(lián)操作;SET NULL 表示置空;NO ACTION 表示不進行任何操作;RESTRICT 表示當ru_products中的某個商品,有相冊數(shù)據(jù)的時候,不允許刪除該商品;
其中,在添加外鍵約束的時候,有幾點要注意:
一、添加外鍵的字段必須先建立索引;
二、當數(shù)據(jù)表中有數(shù)據(jù)的時候,可能導致添加外鍵約束失敗.
新聞熱點
疑難解答
圖片精選