MYSQL外键约束的学习笔记
MySQL有两种常用的引擎类型:MyISAM和InnoDB,目前只有InnoDB引擎类型支持外键约束了,所以我们如果要做外键约束就必须是InnoDB引擎了.
在项目中,很多时候我们建数据表单的时候,两个表示相关联的,并且一个表里面的数据是完全依赖另一张表的数据的.
外键约束语法:
- [CONSTRAINT[symbol]]FOREIGNKEY
- [index_name](index_col_name,...)
- REFERENCEStbl_name(index_col_name,...)
- [ONDELETEreference_option]--phpfensi.com
- [ONUPDATEreference_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中的某个商品,有相册数据的时候,不允许删除该商品;
其中,在添加外键约束的时候,有几点要注意:
一、添加外键的字段必须先建立索引;
二、当数据表中有数据的时候,可能导致添加外键约束失败.
热门评论