默认情况下,mysql的外键约束类型是restrict (no action)类型 ,表示一般的外键约束。
ON DELETE CASCADE ON UPDATE CASCADE 可以设置外键为级联更新、级联删除。
当主表的关联字段发生变更时,从表自动做相应的改变。
级联删除:当主表的关联记录被删除时,从表会自动删除与主表删除记录相关联的记录。
级联更新: 当主表的记录(一般是主键值)发生更新时,从表自动更新自己的外键值。
示例:
创建t_user表
创建 t_address
一个用户能有多个收货地址,所以用户到地址是一对多的关系,并设置级联更新与级联删除。
CREATE TABLE `t_address` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`province` varchar(32) DEFAULT NULL,
`city` varchar(32) DEFAULT NULL,
`detialAddress` varchar(200) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
CONSTRAINT `t_address_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
插入一些测试数据
INSERT INTO t_user (NAME) VALUES
('张三'),('李四'),('王五');
INSERT INTO t_address(province,city,detialAddress,user_id) VALUES
('湖北','武汉','雄楚大道101号',1),
('湖北','武汉','关山大道110号',1),
('湖北','武汉','珞喻路92号',1),
('湖南','长沙','aaa路aaa号',2),
('湖南','长沙','aaa路bbb号',2),
('湖南','长沙','aaa路ccc号',2) ;
这时发现用户表中3条记录,地址表中6表条记录。张三有3个收货地址,李四也是,王五没有收货地址。
这时,更新用户表中id为1的记录,更新id值为10 ,这时发现地址表中前3条记录的外键(user_id)值都从1更新为了10
UPDATE t_user a SET a.`id` =10 WHERE a.`id`=1; #执行这个sql语句时不会报外键约束的错,因为从表外键列上设置了级联更新。
如果主表执行删除 ,则会自动删除从表中的相应记录。
DELETE FROM t_user WHERE t_user.`id`=1 ; #执行时不会报错,因为从表外键上设置了级联删除。
这时从t_address表中的,前3条记录就被级联删除了。
注意:
如果主从表只是普通的外键约束,则在更新/删除主表记录时,需要先更新/删除从表记录,否则将会报外键约束异常,导致操作失败。
。。。。。。