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

时间:2010-04-18 07:56:21

标签: mysql database-design

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

这是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。

这就是我需要的。

有什么想法吗?

1 个答案:

答案 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;;

无论如何,这不会将NULLA中任何具有相同值的值设置为{{1}},因为您无法在MySQL中触发,这会更改触发触发器的同一个表。 / p>

一般来说,如果你想要这样奇怪的东西,我很可能断言你的数据库设计存在缺陷。如果你提供更多细节,我或许可以建议一个更好的。