【问题标题】:Database Design Deleting parent and his children in nested Parent-child situation数据库设计删除嵌套父子情况下的父子关系
【发布时间】:2012-12-04 18:00:07
【问题描述】:

在 Oracle 中,我有一个名为 Category 的表,由三列组成:
ID = 系统生成的唯一密钥,
Catgeory_name = 300 字符, 和 parent_id = 可以是 -1 表示该类别没有父级,也可以是前面描述为 parent_id 的 ID 列中的值。

问题是当我删除一个作为父类的类别时,我还需要自动删除所有子类。我的问题是:SQL 是否提供任何方法来自动执行此操作,或者我应该在我的上层语言(即 C#)中处理它。

例如,如果两个表之间存在外键情况,我知道 SQL 提供 ON DELETE CASCADE 来删除依赖记录以及在删除原始记录请求时删除父记录。

但是,我不知道 SQL 中有什么方法可以自动处理上述情况,这意味着当在上表中删除父级时,所有子级也会被删除。

提前感谢您的帮助。

【问题讨论】:

    标签: c# sql database oracle parent-child


    【解决方案1】:

    如果parent_id 设置为NULL(如果没有父级),您可以在category 上定义一个引用category 中的主键的外键

    SQL> create table category (
      2    id number primary key,
      3    category_name varchar2(300),
      4    parent_id number references category( id )
      5  );
    
    Table created.
    

    然后您可以声明外键约束以在删除父行时自动删除子行。

    如果您真的想使用 -1 的魔法值来指示不存在父级,而不是使用正确的 NULL,您可能会在 category 表中插入一行,id 为 - 1 然后创建外键约束。但这远不如使用NULL 优雅。

    【讨论】:

    • 感谢您的回答。我一直在尝试对其进行测试,但在弄清楚如何在 C# 中传递 NULL 以使其在 DB 中仍然是 NULL 时遇到了麻烦。如果你明白我的意思?因此,我无法尝试您的答案,但在我看来它是正确的。如果你知道这个问题的答案,我也会非常感激。再次感谢。
    • @user1298925 - 你如何在 C# 中传递参数?您使用的是什么 API?实际上,您可能需要创建一个新问题来解决此问题,因为它似乎与此问题无关。
    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2016-09-03
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多