MySQL中主表数据的删除问题(记录一下)

1.问题由来:

最近大二下学期在进行数据库综合实训的课程。
因为自己比较头铁,一咬牙做了一个很简陋的web商城系统(做界面系统展示加分),因为能力和时间原因,SpringBoot框架和vue自学没有学完,前台只是做了几个静态界面,最终只做了一个简单的后台管理系统,增删改查什么的,界面展示,模糊查询和展示使用信息。

那么问题来了:我在做系统的时候,在其他都顺利完成的情况下,有了一个问题,用户信息的删除功能怎么完成。因为用户是好几个表的主表,什么订单,评论,购物清单…

2.简单的想法

因为我用的是mybatis连接数据库,很多事情我就不想在idea中完成,在数据库系统中直接解决就好了。
我当时的想法如下:

  1. 第一种使用触发器,
  • 在删除用户信息前,删除与用户id相关联的数据,订单表啊,购买表啊,评论表啊…
    为了以后还能找到之前删除的用户,还写了一个备份的表,每当从用户表中删除一条信息,就将信息存入备份表中,也是通过触发器完成。
  1. 第二种
  • 在删除用户信息前,一个个在其他标准查找该会员id,先删除从表的相关信息,再删除主表中的数据。

尝试的结果

这两种我都试了,第一种一开始确实好用,系统测试也ok,但当我触发器多写那么一两个后,居然产生了并发冲突问题,我现在也没有搞明白,所以就不推荐了。第二种要一个个查找写查找删除语句,应该也是可行的,但是我放在我的web项目中报错了,不知道是不是自己的编写哪里出问题了。

3.推荐做法——级联删除

然后我就在网上,学习网站和Al语言模型中找到了解决方法,那就是级联删除,
可能是我们学校讲得不够深入,好多领域还没有涉及就结课了,接下来还需要自己去慢慢探索。

3.1级联删除的作用

MySQL中的级联删除是指在删除主表数据时,同时删除与之相关联的从表数据,以保持数据完整性和一致性的操作。

3.2选项

在MySQL中提供了多种级联删除的选项。
包括:

  • CASCADE(级联删除)
  • SET NULL(设置为NULL)
  • RESTRICT(限制删除)
  • NO ACTION(无操作)

3.3级联删除的具体示例

举个具体例子来说明,在一个学生信息系统中,有学生表(student)和成绩表(score)两个表。其中成绩表的外键是学生表的学号(student_id),代表每个成绩记录和一个学生对应。如果想删除学生表中的某个学生记录,但是该学生的成绩记录仍存在,我们可以使用级联删除来自动删除与该学生有关的成绩记录。
首先,需要在创建成绩表时将学号(student_id)列设为外键,并启用级联删除。
代码如下:

CREATE TABLE score (
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  student_id INT UNSIGNED NOT NULL,
  score FLOAT NOT NULL,
  FOREIGN KEY (student_id)
  REFERENCES student (id)
  ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

以上SQL语句创建了成绩表score,并将student_id设置为外键,将删除操作设置为级联删除。
接下来,如果要删除id为100的学生,可以直接执行删除操作,如下所示:
DELETE FROM student WHERE id = 100;

执行该命令后,MySQL数据库会先检查是否有与该学生相关的成绩记录,如果有,MySQL会自动删除所有的与该学生相关的成绩记录,然后再删除学生表中的记录。使用级联删除可以避免手动删除从表记录带来的麻烦,同时确保数据一致性。但是,需要注意,级联删除可能会导致数据的不可逆丢失,需要谨慎使用。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑的蓝孩子~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值