原创

MySQL如何同时删除主外键关联的两张表中的数据

温馨提示:
本文最后更新于 2022年07月13日,已超过 625 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

1. 编写目的

介绍一种方法,解决如下问题:如何同时删除两张相关联的表的记录。
比如说表a的外键fk依赖于表a的id,现在我们需要删除id=5的两条数据。

2. 主要方法

为了简单,推荐更改表a的外键设置,设置删除时策略为CASCADE
如下图:(使用工具navicat)



创建这张表的sql语句如下:

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;

重点关注FOREIGN KEY (pk_userid)
REFERENCES user (pk_userid) ON DELETE CASCADE ON UPDATE CASCADE

这个时候我们需要联合删除时只要删除被依赖的表就可以了,mysql会根据外键依赖关系把两张表的记录都删除。

delete from user where pk_userid = 27;

3. 总结

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

正文到此结束
本文目录