gpt4 book ai didi

mysql - 在 MySQL 的父子关系中强制执行 "favorite"的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-29 15:21:46 25 4
gpt4 key购买 nike

我有一个像这样的父表和子表。

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 的 child 是 parent 的 child 的最佳方法是什么?

我的第一 react 是使用 BEFORE_INSERT 触发器,以便每次修改 favoriteChild 时,首先都会验证它是属于该父项的子项的 ID。

我是否缺少一种更优雅的处理方式?

最佳答案

CREATE TABLE PARENT (
id INT NOT NULL PRIMARY KEY,
favoriteChild INT NULL DEFAULT NULL
);

CREATE TABLE CHILD (
id INT NOT NULL PRIMARY KEY,
parent_id INT NOT NULL,
UNIQUE KEY (parent_id, id),
FOREIGN KEY (parent_id) REFERENCES PARENT(id)
);

ALTER TABLE PARENT ADD FOREIGN KEY (id, favoriteChild)
REFERENCES CHILD (parent_id, id);

现在我们证明,当我们插入父级和子级并使该子级成为其父级的最爱时,约束就得到满足:

mysql> insert into parent values (10, null);
Query OK, 1 row affected (0.00 sec)

mysql> insert into child values (1, 10);
Query OK, 1 row affected (0.00 sec)

mysql> update parent set favoriteChild = 1 where id = 10;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

现在我们尝试另一个父级和子级,但让子级引用不同的父级。我们不能让那个 child 成为错误 parent 的最爱。

mysql> insert into parent values (20, null);
Query OK, 1 row affected (0.00 sec)

mysql> insert into child values (2, 10);
Query OK, 1 row affected (0.00 sec)

mysql> update parent set favoriteChild = 2 where id = 20;
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`parent`, CONSTRAINT `parent_ibfk_1` FOREIGN KEY (`id`, `favoriteChild`) REFERENCES `child` (`parent_id`, `id`))

关于mysql - 在 MySQL 的父子关系中强制执行 "favorite"的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59339955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com