数据库 SQL 约束之 FOREIGN KEY

Hi~ 你在考虑 SQL 的限制吗?我以前做过这个,让我告诉你。

我们来谈谈FOREIGN KEY(外键)。
这一点非常重要,直接关系到表能否识别表与表之间的关系。
上次帮朋友调试系统时,因为外键不正确,数据乱了,头疼了好几天。

就拿你提到的例子来说,学生表和排名表。
学生表中的id必须是主键和唯一键。
订单表中的P_Id表示学生表id。
此时P_Id就是外键。
通过这个外键约束,系统可以知道分配给订单表的P_Id必须与学生表中现有的ID相对应,并且不能与它混淆。

例如,如果你突然手动去订单表格填写一个根本不存在的学生证,系统就会报错并阻止你这样做。
这可以防止“破坏表之间链接的行为”。
同时也防止非法数据录入,比如输入负数或者空值作为ID(当然是否会录入取决于主表如何设置)。

这个外键可以在创建表的时候定义,比如 sql 创建表订单( 对 ID 主键进行排序, P_ID INT, 订单详细信息 VARCHAR(2 5 5 ), 外键 (P_Id) 参考学生 (ID) );
这样,P_Id一定是指学生表的ID。

如果以后表结构改变了,或者发现之前忘记添加了,也可以添加。
例如: sql 更改表中的顺序 添加约束 fk_student FOREIGN KEY(P_Id) REFERENCES Student(ID);
添加完后记得去数据库看看是否生效。

最烦人的是,有时我不得不删除它。
如果要删除此外键约束,只需使用 DROP FOREIGN KEY 命令,例如: sql 更改表中的顺序 REMOVE CONSTRAINT fk_student;
删除完成后,P_Id不能再受约束,必须引用student表的ID。

总之,外键是表之间的“链接”,必须拉紧,否则数据链接就会崩溃。
你需要先了解这一点。
下一篇文章将讨论CHECK约束,它也经常用于限制列中可以填充的值。

如何在MySQL中实现外键约束?外键的创建与管理完整教程!

记得有一次,在一个电商项目中,我使用外键约束来实现一种产品分类层次关系。
当时我创建了一个类别表和一个产品表。
产品表中的category_id字段是外键,指向类别表的主键id。
一开始我一直在product建表语句中添加外键约束,看起来很简单:
sql 创建产品表( id INT 自动递增主键, 名称 VARCHAR(2 5 5 ), 类别_id INT, 约束 fk_category_id 外键 (category_id) 参考类别 (id) );
然后,由于业务需求,我需要删除一些类别,其中涉及到产品表中的数据。
我设置了 ON DELETE CASCADE 外键约束,认为这应该自动处理。
然而,当我实际执行删除操作时,MySQL告诉我:
sql 错误 1 4 5 1 :无法删除或更新父行:外键约束失败...
我刚刚意识到产品表中还有未分类的产品。
直接删除某个类别会导致该产品成为“孤儿”。
我赶紧查看了product表,发现确实有几条category_id为NULL的记录。
于是,我手动将这个产品类别设置为默认类别,然后成功完成了删除操作。

这件事让我深刻认识到,外国的初级束缚即使再强大,也必须谨慎使用。
在设计数据库时,我们不仅需要考虑数据的一致性,还要考虑数据的实际情况,避免外键约束带来的数据问题。
等等,我突然想到,如果我当时使用了ON DELETE SET NULL,可能就不会出现这种情况了。