MySQL—约束—外键约束中删除和更新行为(基础)

一、引言

    上一个博客讲解并演示给字段加外键约束,以及通过外键来保证数据的一致性和完整性。我们一旦为子表 emp 字段 dept_id 添加外键关联之后,再去删除父表的数据之后,判断当前父表的这条数据是否在子表关联关系。如果存在,则不允许删除。

这里实际上涉及到外键约束当中的删除和更新行为。

二、外键约束(删除和更新行为)

(1)主要的行为有以下情况。

注意

1、NO ACTION:(no action) 和 RESTRICT (restrict:限制)

2、NO ACTION、RESTRICT 外键约束的默认行为

3、CASCADE:(cascade),这个操作称为级联。如果有,也删除/更新外键在子表中的记录,也就是跟着父表字段值一起修改或删除

4、SET NULL:如果有,则设置子表中该外键值为 NULL 。也就是断开关联,保证数据的一致性和正确性。

特别注意前4个

5、SET DEFAULT:父表变更,如果有外键,则子表将外键设置成一个默认值

(2)接下来展示,如何在创建外键的时候来指定它们的删除以及更新的规则或者是行为。

语法:

注意

1、前一部分是添加外键的语法。(之前学过)

2、我们只要在之前学的操作语法后面再加上一些东西:

ON UPDATE:(on update 在更新时),然后可以在后面加上要选择的行为:如 CASCADE

ON DELETE:(on delete 在删除时),如上

三、实操

还是用之前建立的两张表:员工表 emp 和 部门表:dept 。

(1)数据准备
CREATE TABLE dept (
    id INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY,
    name VARCHAR(50) NOT NULL COMMENT '部门名称'
) COMMENT '部门表';
INSERT INTO dept (id, name) VALUES (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');

CREATE TABLE emp (
    id INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY,
    name VARCHAR(50) NOT NULL COMMENT '姓名',
    age INT COMMENT '年龄',
    job VARCHAR(20) COMMENT '职位',
    salary INT COMMENT '薪资',
    entrydate DATE COMMENT '入职时间',
    managerid INT COMMENT '直属领导ID',
    dept_id INT COMMENT '部门ID'
) COMMENT '员工表';

INSERT INTO emp (id, name, age, job, salary, entrydate, managerid, dept_id) VALUES (1,'金庸',66,'总裁',20000,'2000-01-01',null,5),
                                                                                   (2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),
                                                                                   (3,'杨逍',33,'开发',8400,'2000-11-03',2,1),
                                                                                   (4,'韦小笑',48,'开发',11000,'2002-02-05',2,1),
                                                                                   (5,'常遇春',43,'项目经理',10500,'2004-09-07',3,1),
                                                                                   (6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1);

部门表:dept

员工表:emp

(2) 开始操作

当前这两张表还没有任何的外键约束。

接下来给他们建立外键约束,还有要指定它们的删除和更新行为。

1、首先测试加的是:CASCADE
/* add constraint 外键  括号里代表的外键字段 */
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE;

子表外键字段对应的值全部变成6,也就是因为父表的字段的值的更新。

注意:如果我把父表中的字段值删除了之后,子表中外键的值也会跟着删除!!!

2、 其次测试加的是:SET NULL

在 DataGrip 中删除之前的两张表,再执行之前的SQL语句去重新创建这两张表。

/* add constraint 外键  括号里代表的外键字段 */
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id) ON UPDATE SET NULL ON DELETE SET NULL;

子表外键字段对应的值全部变成null,也就是因为父表字段值的删除。

四、其次在工具 DataGrip 可以直接图形界面工具直接操作 

1、第一步

2、第二步

 到此关于这篇博客的外键约束的学习就结束了。

### MySQL 约束与锁的行为及其影响 约束数据库设计中用于维护表之间的参照完整性。当在上执行操作MySQL会自动处理相应的锁定机制以确保数据的一致性完整性。 #### 锁定行为 对于带有关系的父表子表,在进行插入、更新删除操作MySQL会对涉及的数据行施加不同类型的锁: - **共享锁 (Shared Locks)**:读取父表中的记录通常会设置共享锁,允许其他事务并发读取相同的数据行。 - **排他锁 (Exclusive Locks)**:修改或删除父表中的记录,则需要获取排他锁来阻止任何其它写入操作以及部分读取操作,直到当前事务完成为止[^1]。 这些锁的存在可以防止违反约束的情况发生,比如不允许删除正在被子表引用的父表记录;同样也避免了由于并发行带来的潜在不一致问题。 #### 性能影响 虽然有助于保持良好的数据模型结构,但在高并发场景下可能会带来性能上的挑战: - 频繁地对关联字段做查询验证增加了额开销; - 插入新纪录到子表之前必须先确认对应的父级实体存在与否; - 更新/移除父表项前需检查是否有依赖它的子项目存在,并相应调整后者的状态或直接拒绝变更请求。 因此,在实际应用开发过程中应当权衡使用所带来的好处与其可能引发的问题,尤其是在大规模分布式环境中更应谨慎考虑是否启用此特性。 ```sql -- 创建具有约束的两个表格示例 CREATE TABLE parent ( id INT NOT NULL, PRIMARY KEY (id) ); CREATE TABLE child ( id INT NOT NULL, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

岁岁岁平安

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

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

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

打赏作者

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

抵扣说明:

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

余额充值