mysql~数据完整性考虑~外键约束
在MySQL中,当为表添加外键约束时,可以指定在删除或更新父表记录时的行为。下面进行总结:
-
CASCADE
:当父表中的记录被删除或更新时,自动删除或更新子表中相关联的记录。这意味着如果父表中的记录被删除,那么相应的子表中与之关联的记录也会被删除。 -
SET NULL
:当父表中的记录被删除或更新时,子表中的外键列会被设置为NULL
。这意味着如果父表中的记录被删除,子表中的外键列将会被置空。 -
SET DEFAULT
:当父表中的记录被删除或更新时,子表中的外键列会被设置为默认值。这意味着如果父表中的记录被删除,子表中的外键列将会被设置为预先定义的默认值。 -
NO ACTION
:当父表中的记录被删除或更新时,不采取任何动作。这意味着如果存在父表和子表之间的关联,但是父表中的记录被删除或更新时,在子表中不会发生任何变化,操作将会被拒绝。 -
RESTRICT
: 当尝试删除或者更新父表中有关联子表数据时,如果子表中存在对应的外键关联数据,则不允许操作父表数据
这些选项可以根据实际需求来选择,以确保数据的完整性和一致性。
其中,RESTRICT我再详细说明一下其作用如下:
-
DELETE RESTRICT:当尝试删除父表中有关联子表数据时,如果子表中存在对应的外键关联数据,则不允许删除父表数据,会抛出一个错误。这样可以确保数据的完整性,避免因删除父表数据而导致子表数据无法正确关联。
-
UPDATE RESTRICT:当尝试更新父表中被外键引用的列的值时,如果子表中存在对应的外键关联数据,则不允许更新父表数据,会抛出一个错误。这也是为了保证数据的完整性,防止因更新父表数据而导致子表数据关联出现问题。
实例
- 建立两张表user_info和user_ext,然后user_ext中的user_id是user_info的id的外键,并使用restrict方式,如果要更新或者删除user_info中的数据时,保护了user_ext已经引用的数据。
CREATE TABLE `user_info` (
`id` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
CREATE TABLE `user_ext` (
`id` int(11) NOT NULL,
`user_id` int(11) DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `user_id`(`user_id`) USING BTREE,
CONSTRAINT `user_ext_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user_info` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
当删除主表数据(user_ext中已经存在引用的数据),会出现这个提示,不让你删除主表数据,要想删除,需要先删子表的才行
当然,如果希望在删除主键数据时,同时自动将子表数据删除,就可以在配置外键时,选择cascade即可
相关文章
- 优化GreatSQL日志文件空间占用 GreatSQL对于日志文件磁盘空间占用,做了一些优化,对于binlog、...03-18
- "数据约束条件" date: 2022-11-24T21:24:31 08:00 draft: false MySQL字段约束条件 无符号, 零填充...03-18
【GreatSQL优化器-16】INDEX_SKIP_SCAN
【GreatSQL优化器-16】INDEX_SKIP_SCAN 一、INDEX_SKIP_SCAN介绍 GreatSQL 优化器的索引跳跃扫描(Index Ski...03-18- MySQL 是一个非常流行的开源关系数据库管理系统,在各种应用场景中都得到了广泛的应用。随...03-18
- 🤖 DB-GPT 是一个开源的 AI 原生数据应用程序开发框架,具有 AWEL(代理工作流表达式语...03-18
GreatSQL 8.0.32-27 GA (2025-3-10)
GreatSQL 8.0.32-27 GA (2025-3-10) 版本信息 发布时间:2025年3月10日 版本号:8.0.32-27, Revision aa66a38591...03-18- 6. MySQL 索引的数据结构(详细说明) @目录6. MySQL 索引的数据结构(详细说明)1. 为什么使用索引2...03-18
- @Override @Transactional(rollbackFor = Exception.class) public void batchInsertDeviceData(IotMsgNotifyData iotMsgNotifyDa...03-18
- 个人Qt项目总结——数据库查询断言问题 问题: 当我使用MySQL数据库的查询操作时, 如果查询...03-18
- MySQL 是一种广泛使用的关系数据库管理系统,MySQL 8 是其最新的主要版本,结合了出色的性能和...03-18
最新评论