2010-04-18 53 views
0

如何在父级上设置空值时删除子级行(删除级联?)?将父记录设置为空以便删除子项:howto?

这是db设计。

表A [ID,b_id_1,b_id_2]

表B [ID,等领域...]

b_id_1和b_id_2可以是NULL

如果其中任何为空,则装置NO乙记录对应FK(有它们中的2)

所以(b_id_1,b_id_2)可以是(NULL,NULL),(100,空),(NULL,100_or_any_other_number)等

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

什么FK设计应该适用于2表?

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

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

但查询必须只触摸一个表!

然后你会发现,在mysql SQL语法中没有像“从一行中删除字段值”这样的语句。

我们只能将它设置为NULL。

这就是我需要的。

任何想法?

回答

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:如果你想从一个表的角度这样做(为什么地球上,你会希望这样???),那么你无法绕过触发器,例如, G。

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具有相同的价值,因为你不能让MySQL中的触发器,改变触发扳机同桌。一般来说,如果你想要这样的奇怪东西,我可以很有可能断言你的数据库设计是有缺陷的。如果你提供更多的细节,我可以建议一个更好的细节。

+0

@codeholic我忘了添加一件重要的事情。查询应该从表格的角度来执行!是的,如果我们使用这个On delete set null并从B表中删除一条记录,它将起作用。但查询必须只触摸一张桌子! – EugeneP 2010-04-18 08:05:11

+0

@EugeneP:我已经更新了我的答案。 – codeholic 2010-04-18 12:39:19

+0

谢谢,这不是一个简单的问题,你的解决方案看起来很漂亮。 – EugeneP 2010-04-18 12:55:24

相关问题