【问题标题】:HOW TO: When record on table A gets deleted all records on table B, that are associated with table A, should ALSO be deleted?如何:当表 A 上的记录被删除时,表 B 上与表 A 关联的所有记录也应该被删除吗?
【发布时间】:2011-08-16 11:44:07
【问题描述】:

考虑到以下方案:

我们需要确保,如果一个关联被删除,属于该关联的所有狗也应该被删除。

但是,在这样做的同时,保留 Association 和 Dog 表之间实际存在的关系是有意义的,因为每个关联可以有多个 Dog,但是,一个 Dog 只属于一个 Association。所以我相信外键配置是正确的。

我相信我应该在某个地方应用 Cascade,但我不知道在哪里。 :(

请指教

【问题讨论】:

    标签: mysql mysql-workbench table-relationships


    【解决方案1】:

    要在 Dog 和关联之间添加关系:在 Dog 属性上,为关联的关联 ID 列添加一个新的外键,该列引用关联.id。选择删除时CASCADE

    您也可以在查询窗口中执行这些步骤(个人而言,我仅在需要打印数据库结构时才使用图形工具)。

    ALTER TABLE Dog ADD CONSTRAINT `FK_byAssociationIdDog` 
     FOREIGN KEY(association_id)  
    REFERENCES Association(id) ON UPDATE CASCADE ON DELETE CASCADE;
    

    【讨论】:

    • 我认为在 dog.association_id 上不需要 UNIQUE 索引,因为不需要一对一的关系,因为@MEM 指出一个关联可以拥有多条狗,并且dog 被定义为我认为基于 id 主键的唯一性。如果您设置 UNIQUE 索引,那么只有一只狗可能属于一个关联,根据我对要求的理解,这不是所需的行为。
    • 是的,伙计们,你是对的,我误解了要求。您不需要唯一约束。
    • 可能是的,但这取决于您希望在/如果更改用户 ID 时发生什么。如果您不输入 ON UPDATE CASCADE 那么当用户 id 更改时,所有具有与更改后的 id 匹配的 user_id 的关联行都将保持原样(如果您想保持参照完整性,这可能不是一件好事) .我建议查看这个 stackoverflow 问题here
    • 这取决于您的需求。如果您希望关联中的 user_id 在您更改 User.id 时自动更改其值,则将 CASCADE 更改为 On update。如果要限制对 User.id 列的更改,如果它在 Association 表中至少有一个相关行,则保持原样。
    • @MEM:你也可以指定RESTRICT,意思和mysql中的NO ACTION一样,但是听起来更不言自明(这只是我的看法,没有区别)跨度>
    【解决方案2】:

    选择“Dog”作为您的目标表,然后选择“外键”选项卡,您应该在那里为“association_id”字段选择了一个外键。一旦您发现只需检查“删除时”的“外键选项”部分中显示的弹出值,它应该显示“级联”(类似于上面的屏幕截图显示的内容 - 如果它没有显示“级联”,只需选择它)。

    【讨论】:

    • 哦... 1)我虽然那样,如果我这样做,当我删除一条狗时,关联也会被删除!但事实并非如此,嗯? 2)通过查看此屏幕截图,我打算,如果关联被删除,用户也应该被删除。我用上面的方法做到了吗?
    • 不会保留关联,因为“关联”和“狗”之间存在一对多关系。您在 dog 上提供的外键与关联有关,因此当删除“关联”时,级联删除将发生在“狗”表上,其中任何行包含与已删除“关联”的 id 匹配的“关联 ID” '。我希望这有助于清除它。删除“狗”行不会导致删除“关联”。
    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多