Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL外键类型及应用

MySQL外键类型及应用场景总结

作者:四七伵

这篇文章主要介绍了 MySQL 外键的类型(RESTRICT、CASCADE、SET NULL、NO ACTION)及其应用场景、优缺点和使用注意事项,通过创建和测试外键,阐述了不同类型外键在主表删除或更新数据时子表的变化,需要的朋友可以参考下

前言MySQL的外键简介:在 MySQL 中,外键 (Foreign Key) 用于建立和强制表之间的关联,确保数据的一致性和完整性。外键的作用主要是限制和维护引用完整性 (Referential Integrity)。

1、外键效果演示

1.1、创建和添加两张表数据

-- 创建父表
CREATE TABLE `users` (
  `user_id` INT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`user_id`)
);

-- 创建子表
CREATE TABLE `orders` (
  `order_id` INT NOT NULL AUTO_INCREMENT,
  `order_date` DATE NOT NULL,
  `user_id` INT,
  PRIMARY KEY (`order_id`)
);

-- 插入父表数据
INSERT INTO `users` (`username`) VALUES ('Alice');
INSERT INTO `users` (`username`) VALUES ('Bob');

-- 插入子表数据
INSERT INTO `orders` (`order_date`, `user_id`) VALUES ('2024-12-25', 1);
INSERT INTO `orders` (`order_date`, `user_id`) VALUES ('2024-12-26', 2);

1.2、测试外键作用效果

1.2.1、RESTRICT

-- 添加外键约束到现有的子表 `orders`
ALTER TABLE `orders`
ADD CONSTRAINT `fk_user_id`
FOREIGN KEY (`user_id`)
REFERENCES `users`(`user_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT;
-- 删除已被引用的外键
DELETE FROM `users` WHERE `user_id` = 1

-- 输出结果 --
> 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`orders`, CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE RESTRICT ON UPDATE RESTRICT)
> 查询时间: 0.013s


-- 修改已被引用的外键
UPDATE `users` SET `user_id` = 3 WHERE `user_id` = 1

-- 输出结果 --
> 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`orders`, CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE RESTRICT ON UPDATE RESTRICT)
> 查询时间: 0.009s

因为删除和更新都执行失败,所以子表没有变化。

总结RESTRICT类型的外键,如果该记录在子表中有引用,禁止删除或更新父表中的记录。

1.2.2、CASCADE

-- 添加外键约束到 `orders` 表,使用 CASCADE
ALTER TABLE `orders`
ADD CONSTRAINT `fk_user_id`
FOREIGN KEY (`user_id`)
REFERENCES `users`(`user_id`)
ON DELETE CASCADE
ON UPDATE CASCADE;
-- 删除已被引用的外键
DELETE FROM `users` WHERE `user_id` = 1

-- 输出结果 --
> Affected rows: 1
> 查询时间: 0.016s


-- 修改已被引用的外键
UPDATE `users` SET `user_id` = 3 WHERE `user_id` = 2

-- 输出结果 --
> Affected rows: 1
> 查询时间: 0.013s

因为两条SQL都执行成功。order_id = 1的数据被删除,order_id = 2user_id的值被修改为3

总结CASCADE类型的外键,当父表中的记录被删除或更新时,子表中的相关记录也会自动被删除或更新。

1.2.3、SET NULL

-- 确保子表的外键列允许 NULL
ALTER TABLE `orders`
MODIFY COLUMN `user_id` INT NULL;

-- 添加外键约束到 `orders` 表,使用 SET NULL
ALTER TABLE `orders`
ADD CONSTRAINT `fk_user_id`
FOREIGN KEY (`user_id`)
REFERENCES `users`(`user_id`)
ON DELETE SET NULL
ON UPDATE SET NULL;
-- 删除已被引用的外键
DELETE FROM `users` WHERE `user_id` = 1

-- 输出结果 --
> Affected rows: 1
> 查询时间: 0.014s


-- 修改已被引用的外键
UPDATE `users` SET `user_id` = 3 WHERE `user_id` = 2

-- 输出结果 --
> Affected rows: 1
> 查询时间: 0.012s

两条SQL都执行成功。order_id = 1user_id的值变为NULLorder_id = 2user_id的值变为NULL

总结SET NULL类型的外键,当父表记录被删除或更新时,子表中对应的外键值会更新为 NULL

1.2.4、NO ACTION

-- 添加外键约束,使用 NO ACTION
ALTER TABLE `orders`
ADD CONSTRAINT `fk_user_id`
FOREIGN KEY (`user_id`)
REFERENCES `users`(`user_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
-- 删除已被引用的外键
DELETE FROM `users` WHERE `user_id` = 1

-- 输出结果 --
> 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`orders`, CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`))
> 查询时间: 0.013s


-- 修改已被引甮的外键
UPDATE `users` SET `user_id` = 3 WHERE `user_id` = 2

-- 输出结果 --
> 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`orders`, CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`))
> 查询时间: 0.025s

因为删除和更新都执行失败,所以子表没有变化。

总结NO ACTION类型的外键(和RESTRICT的作用相同),如果该记录在子表中有引用,禁止删除或更新父表中的记录。

1.3、外键作用描述以及优缺点总结

1.3.1、RESTRICT

1.3.2、CASCADE

1.3.3、SET NULL

1.3.4、NO ACTION(等价于 RESTRICT)

2、外键类型适用场景总结(表格)

外键类型适用场景注意事项
CASCADE父子关系强关联,父表删除或更新后子表无条件跟随。谨慎使用,避免误删除或误更新。
SET NULL子表记录在父表删除或更新后仍有意义,允许外键列为 NULL。子表的外键列必须允许 NULL,需谨防数据孤立。
NO ACTION / RESTRICT强制要求父表记录的删除或更新必须先解除子表关联。增加了操作复杂性,但能严格保护数据完整性。

3、外键于业务开发而言的优缺点

3.1、优点

3.2、缺点

4、外键的使用注意事项

以上就是MySQL外键类型及应用场景总结的详细内容,更多关于MySQL外键类型及应用的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文