Mysql中的主表中的数据的删除
1.问题由来:
最近大二下学期在进行数据库综合实训的课程。
因为自己比较头铁,一咬牙做了一个很简陋的web商城系统(做界面系统展示加分),因为能力和时间原因,SpringBoot框架和vue自学没有学完,前台只是做了几个静态界面,最终只做了一个简单的后台管理系统,增删改查什么的,界面展示,模糊查询和展示使用信息。
那么问题来了:我在做系统的时候,在其他都顺利完成的情况下,有了一个问题,用户信息的删除功能怎么完成。因为用户是好几个表的主表,什么订单,评论,购物清单…
2.简单的想法
因为我用的是mybatis连接数据库,很多事情我就不想在idea中完成,在数据库系统中直接解决就好了。
我当时的想法如下:
- 第一种使用触发器,
- 在删除用户信息前,删除与用户id相关联的数据,订单表啊,购买表啊,评论表啊…
为了以后还能找到之前删除的用户,还写了一个备份的表,每当从用户表中删除一条信息,就将信息存入备份表中,也是通过触发器完成。
- 第二种
- 在删除用户信息前,一个个在其他标准查找该会员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会自动删除所有的与该学生相关的成绩记录,然后再删除学生表中的记录。使用级联删除可以避免手动删除从表记录带来的麻烦,同时确保数据一致性。但是,需要注意,级联删除可能会导致数据的不可逆丢失,需要谨慎使用。