2013-05-09 129 views
1

我需要ON DELETE CASCADE是否适合的建议下表ON DELETE CASCADE在这种情况下?

CREATE TABLE category 
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(255) NOT NULL, 
    maincategory INT DEFAULT NULL, 
    FOREIGN KEY(maincategory) REFERENCES category(id) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE = InnoDB DEFAULT CHARSET = utf8; 

在使用在这种情况下,DELETE CASCADE会简单地删除所有子类,如果主类别获取deleted.Is该建议的方法?

+0

如果您在说ab只有这个东西是的,我认为它很好。但有时你需要做一个假删除(带有一个名为isDeleted的列),当你这样做。 ON DELETE CASCADE不会再造成问题,所以我说这样做。 – ncm 2013-05-09 19:25:55

回答

1

您正试图创建树结构的表格表示形式。您正在使用邻接模型,将父项的ID存储在maincategory字段中(通常称为parent_id)。

是的,这种方法是完全有效的。使用ON DELETE CASCADE您可以保护自己免于DELETE异常。

我也建议你阅读有关嵌套套 - 这是在SQL代表树木非常有效的技术:

http://www.evanpetersen.com/item/nested-sets.html

How to represent a data tree in SQL?

http://en.wikipedia.org/wiki/Nested_set_model

这本书: Joe Celko“用于Smarties的SQL中的树和层次结构”

+0

谢谢,很好的回答!我的桌子有类似的设计问题,也许你可以帮我吗?我有一个引用类别表的产品。现在,我已经在产品表FOREIGN KEY category_id中设置了ON DELETE SET NUL和ON UPDATE CASCADE,所以当类别被删除时,产品仍然保留在表格中,这是否聪明?再次感谢。 – Zed 2013-05-09 20:18:15

+0

@Zed如果您希望在删除类别后保留产品,则此方法是正确的。如果没问题,请接受答案。 – user4035 2013-05-09 20:25:20