您的位置:首页 > 数据库 > MySQL

温习下Mysql外键 Foreign Key的 Cascade 和 Restrict

2014-12-04 00:00 375 查看
摘要: 温习下Mysql的外键 Foreign Key Cascade 和 Restrict

外键约束:

一. InnoDB引擎类型

二. 两个表的列必须是数据类型相似

三. 外键的定义语法

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。
ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT(限制外表中的外键改动)
CASCADE(跟随外键改动)
SET NULL(设空值)
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)

注:

Cascade方式
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
On delete cascade从mysql3.23.50开始可用; on update cascade从mysql4.0.8开始可用

Restrict方式
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

四. 举例

CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='产品表';


CREATE TABLE `product_attr` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) DEFAULT NULL,
`name` varchar(32) DEFAULT '',
PRIMARY KEY (`id`),
KEY `pid` (`pid`) USING BTREE,
CONSTRAINT `product_attr_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `product` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='产品属性表';


给产品表和产品属性表添加数据

INSERT INTO `product` (`name`) VALUES ('电视')

INSERT INTO `product_attr` (`pid`, `name`) VALUES ('2', '32寸')

在Restrict方式 下删除产品

DELETE FROM `product` WHERE (`id`='2')

提示1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`product_attr`, CONSTRAINT `product_attr_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `product` (`id`))

在Restrict方式 下添加产品属性

INSERT INTO `product_attr` (`pid`, `name`) VALUES ('3', 'LED')

提示1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`product_attr`, CONSTRAINT `product_attr_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `product` (`id`))


这个就是触发器在Restrict方式下限制动作

在看看Cascade方式

修改产品属性表结构

ALTER TABLE `product_attr` DROP FOREIGN KEY `product_attr_ibfk_1`;

ALTER TABLE `product_attr` ADD CONSTRAINT `product_attr_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE


然后删除产品

DELETE FROM `product` WHERE (`id`='2')


在看看产品属性表是否还有产品id=2 的属性,已经没有了

这就是Cascade方式下的同步改动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Msqlfk
相关文章推荐