gpt4 book ai didi

mysql - 将父记录设置为空,以便删除子记录 : howto?

转载 作者:行者123 更新时间:2023-11-29 15:03:27 30 4
gpt4 key购买 nike

在父行上设置空值时如何删除子行(在删除级联上?)?

这是数据库设计。

表 A [id、b_id_1、b_id_2]

表B[id,其他字段...]

b_id_1 和 b_id_2 可以为 NULL

如果其中任何一个为null,则表示对应的FK没有B记录(有2条)

所以 (b_id_1,b_id_2) 可以是 (null,null)、(100, null)、(null, 100_or_any_other_number) 等

如何在一个 SQL 查询中将 b_id_1(或 b_id_2)设置为 null 并删除 B 中具有此 id 的所有行?

这两个表应该应用什么 FK 设计?

应该从表的角度执行查询!

是的,如果我们使用“On delete set null”并从 B 表中删除一条记录,它就会起作用。

但是查询必须只触及表!!

你看,mysql SQL语法中没有“从一行中删除字段值”这样的语句。

我们只能将其设置为NULL。

这就是我需要的。

有什么想法吗?

最佳答案

删除时设置为空

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]

reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION

更新:如果您想从 A 表的角度进行操作(您到底为什么要这样做???),那么您无法绕过触发器,例如。克。

DELIMITER ;;

CREATE TRIGGER tau_A AFTER UPDATE ON A
FOR EACH ROW
BEGIN
IF OLD.b_id_1 IS NOT NULL AND NEW.b_id_1 IS NULL;
THEN
DELETE FROM B WHERE id = OLD.b_id_1;
END IF;
IF OLD.b_id_2 IS NOT NULL AND NEW.b_id_2 IS NULL;
THEN
DELETE FROM B WHERE id = OLD.b_id_2;
END IF;
END;;

无论如何,A中具有相同值的任何值都不会设置为NULL,因为您无法在MySQL中创建一个触发器来更改同一个表触发了触发器。

一般来说,如果你想要像这样奇怪的东西,我可以断言你的数据库设计很有可能是有缺陷的。如果您提供更多详细信息,我也许可以提出更好的建议。

关于mysql - 将父记录设置为空,以便删除子记录 : howto?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2661530/

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