如何在父级设置空值时删除子行(在删除级联?上)?
这是db设计。
表A [id,b_id_1,b_id_2]
表B [id,其他字段......]
b_id_1和b_id_2可以为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的所有行?
应该对2个表应用什么FK设计?
QUERY应该从桌子的角度来执行!
是的,如果我们使用“On delete set null”并从B表中删除记录,它将起作用。
但查询必须只触摸一张桌子!!
你知道,mysql SQL语法中没有“从行中删除字段值”这样的声明。
我们只能将其设置为NULL。
这就是我需要的。
有什么想法吗?
答案 0 :(得分:1)
<强> ON DELETE SET 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
UPDATE:如果你想从A表的角度来看(为什么你想要那个?),那么你就无法绕过触发器,e。克。
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;;
无论如何,这不会将NULL
中A
中任何具有相同值的值设置为{{1}},因为您无法在MySQL中触发,这会更改触发触发器的同一个表。 / p>
一般来说,如果你想要这样奇怪的东西,我很可能断言你的数据库设计存在缺陷。如果你提供更多细节,我或许可以建议一个更好的。