【问题标题】:ON DELETE CASCADE in this case?在这种情况下删除级联?
【发布时间】:2013-05-09 19:19:58
【问题描述】:

我需要关于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;

在这种情况下,如果主类别被删除,ON DELETE CASCADE 将简单地删除所有子类别。这是推荐的方法吗?

【问题讨论】:

  • 如果你只是在谈论这件事,是的,我认为它很好。但有时您需要进行虚假删除(使用名为 isDeleted 的列)以及何时执行此操作。 ON DELETE CASCADE 不会再引起问题,所以我说这样做。

标签: mysql cascade sql-delete


【解决方案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“聪明人用 SQL 中的树和层次结构”

【讨论】:

  • 谢谢,很好的答案!我的一张桌子有类似的设计问题,也许你可以帮助我?我有一个引用 Category 表的表 Product。现在,我在 Product 表 FOREIGN KEY category_id 中设置了 ON DELETE SET NUL 和 ON UPDATE CASCADE,所以当 Category 被删除时 Product 仍然保留在表中,这很聪明吗?再次感谢。
  • @Zed 如果要在分类删除后保留产品,这种做法是正确的。如果可以,请采纳答案。
猜你喜欢
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
相关资源
最近更新 更多