当前位置:首页 > Mysql教程 > 列表

MYSQL外键约束的学习笔记

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-16 15:54:54 浏览: 评论:0 

MySQL有两种常用的引擎类型:MyISAM和InnoDB,目前只有InnoDB引擎类型支持外键约束了,所以我们如果要做外键约束就必须是InnoDB引擎了.

在项目中,很多时候我们建数据表单的时候,两个表示相关联的,并且一个表里面的数据是完全依赖另一张表的数据的.

外键约束语法:

  1. [CONSTRAINT [symbol]] FOREIGN KEY 
  2.     [index_name] (index_col_name, ...) 
  3.     REFERENCES tbl_name (index_col_name,...) 
  4.     [ON DELETE reference_option]  --phpfensi.com 
  5.     [ON UPDATE reference_option] 
  6. 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中的某个商品,有相册数据的时候,不允许删除该商品;

其中,在添加外键约束的时候,有几点要注意:

一、添加外键的字段必须先建立索引;

二、当数据表中有数据的时候,可能导致添加外键约束失败.

Tags: MYSQL外键约束 MYSQL约束

分享到: