mysql中外键约束级联更新与删除

来源:互联网 发布:非线性最优化确定参数 编辑:程序博客网 时间:2024/05/01 12:46


默认情况下,mysql的外键约束类型是restrict (no action)类型 ,表示一般的外键约束。


ON DELETE CASCADE ON UPDATE CASCADE   可以设置外键为级联更新、级联删除。

当主表的关联字段发生变更时,从表自动做相应的改变。

级联删除:当主表的关联记录被删除时,从表会自动删除与主表删除记录相关联的记录。

级联更新:   当主表的记录(一般是主键值)发生更新时,从表自动更新自己的外键值。

示例:

创建t_user表


CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

创建  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条记录就被级联删除了。 


注意:

如果主从表只是普通的外键约束,则在更新/删除主表记录时,需要先更新/删除从表记录,否则将会报外键约束异常,导致操作失败。

。。。。。。


0 0
原创粉丝点击