【发布时间】:2019-12-14 23:11:40
【问题描述】:
我有一个这样的父子表。
PARENT
id - INT NOT NULL
favoriteChild - NULL DEFAULT NULL
CHILD
id - INT NOT NULL
parent_id - INT NOT NULL
RELATIONSHIPS
parent.favoriteChild -> child.id
child.parent_id -> parent.id
我正在创建一个父母,然后是一个孩子。我有一个触发器设置,以便第一次为给定父级创建子级时,设置 favoriteChild 的值。
保证设置为 favoriteChild 的孩子是父母的孩子的最佳方法是什么?
我的第一反应是使用 BEFORE_INSERT 触发器,以便在修改 favoriteChild 时首先验证它是属于该父母的孩子的身份和 id。
我是否错过了一种更优雅的处理方式?
【问题讨论】:
-
如果你使用 MySQL 8.0,你可以使用
CHECK约束。 -
@Barmar -
CHECK约束不能查询其他表。 -
这是一个常见问题解答。在考虑发布之前,请始终在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com 和标签,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS FK 被称为关系,但是是约束。表格代表关系(船舶)/关联。 FK 约束表示,如果某些值一起参与某个关系/关联,那么它们也会在另一个某个关系/关联中参与一次。
-
请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL 的 SQL,其中包括约束、索引和表格初始化。
-
parent和child不应该是单独的表,因为孩子可以有自己的孩子(第一个父母的孙子),所以它应该只是一个person表。每个人都应该有mother_id、father_id和favorite_child_id。CHECK约束可以验证这一点。
标签: mysql database foreign-keys