在父行上设置空值时如何删除子行(在删除级联上?)?
这是数据库设计。
表 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/