如何删除有外键关系的两张表的数据

为了保证数据完整 ,有一种方式就是两张表设置外键foreign key。 但是删除操作 如果只删除主键表的行数据会报外键约束异常。

外键的定义

如果一个字段X在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段X称为表二的外键;换句话说如果关系模式R1中的某属性集不是自己的主键,而是关系模式R2的主键,则该属性集称为是关系模式R1的外键。

二:主键表和外键表的理解

(1)以公共关键字作主键的表为主键表(父表,主表)

(2)以公共关键字作外键的表为外键表(从表,外表)
举个例子:

这里有2张表(student和depart)学生表和院系表,这里的字段departNum就是学生表的外键,这里的外键表是学生表,主键表是院系表。
在这里插入图片描述
在这里插入图片描述

DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
  `openid` char(50) NOT NULL DEFAULT '',
  `pk_userid` bigint(20) unsigned DEFAULT NULL,
  `nickname` char(60) DEFAULT NULL,
  `gender` char(10) DEFAULT NULL,
  `city` char(60) DEFAULT NULL,
  `province` char(60) DEFAULT NULL,
  `country` char(60) DEFAULT NULL,
  `avatar_url` char(150) DEFAULT NULL,
  `gmt_create` datetime NOT NULL,
  `gmt_modified` datetime NOT NULL,
  PRIMARY KEY (`openid`),
  KEY `user_info_ibfk_1` (`pk_userid`),
  CONSTRAINT `user_info_ibfk_1` FOREIGN KEY (`pk_userid`) 
  REFERENCES `user` (`pk_userid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

on delete 规则策略:

1、CASCADE:级联

  REFERENCES `user` (`pk_userid`) ON DELETE CASCADE ON UPDATE CASCADE

(1)所谓的级联删除,就是删除主键表的同时,外键表同时删除。

(2)以上面的例子将就是,假如院系表中的某个院系被删除了,那么在学生表中要想查询这个被删除的院系号所对应的院信息就会报错,因为已经不存在这个系了,所以,删除院系表(主键表)时必须删除其他与之关联的表,这里就说明了外键的作用,保持数据的一致性、完整性。当然反过来讲,你删除学生表中的记录,并不影响院系表中的数据,你查询院系号也能正确查询。所以删除外键表中的数据并不影响主键表

更改外键删除时的处理策略来实现的,相对来说比较简单,但是同时也可能会带来某些其他问题。
当然,两个相互关联的表,某张表更新时,另外一张表跟着更新的也应该使用CASCADE策略

2、NO ACTION(非活动,默认)、RESTRICT:约束/限制
当取值为No Action或者Restrict时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。(即外键表约束主键表)
3、SET NULL
当取值为Set Null时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(,一样是外键表约束主键表,不过这就要求该外键允许取null)。

NO ACTION和RESTRICT的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执行,后者具有最高的优先权执行。

如何删除外键关系的两张表(父表 子表)的数据

方式一

你先删除主表中的数据,那子表中的外键就没有对应的主键了,所有会报错误,你先删了子表中的数据,然后删除主表中的数据就OK了。

要删除的数据由于有外键关系不能删除的话,就先删除外键所在的表的行数据,然后删除对应的主键表的行数据 这样删除是一个完整的删除,想要只删除主键表的行数据由于外键关系是不能删除的。

方式二

首先,在数据库中查看外键是否有效(没有设置之前都是有效),命令:select@@foreign_key_checks;
将外键的值设置为0,此时就是失效状态,命令:
set foreign_key_checks = 0,这时就能删除数据了。
删除之后,外键再设置为有效:set foreign_key_checks = 1

两张表互为外键约束,删除任何一张表都会出错

解决方法:临时关闭检查

语法:set @@foreign_key_checks=OFF;

https://blog.csdn.net/metheir/article/details/81877055
https://blog.csdn.net/smileyan9/article/details/89422139

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值