【问题标题】:Manually call cascade delete?手动调用级联删除?
【发布时间】:2011-12-01 14:23:20
【问题描述】:

假设我有 3 个表,“child1”、“child2”和“child3”,它们都有一个指向“parent”表的外键。 表“父”有一个字段“状态”,我希望如果一个元素的状态设置为“0”,它的所有子元素都将被删除。 (我使用触发器来检测状态变化)。 所以这就像调用“级联删除”,但没有删除对象......

有什么好办法吗?

【问题讨论】:

  • 所以如果我理解,您打算在不实际删除父行的情况下删除所有与 FK 相关的子行?
  • 如果您使用触发器,那么您已经很可能实施了非常糟糕的做法(并且性能会受到影响)。
  • @Romain 我非常不同意触发器 = 不好的做法。事实上,这个问题听起来像是一个触发器的有效用例,它会在父状态更改时删除子行。
  • @JoeStefanelli 我不是说triggers = bad practice,而是triggers = often bad practice symptom。触发器肯定有有效的案例,这可能是一个,但这通常不会扩大(但我想这取决于你的可扩展性需求)。

标签: mysql cascading-deletes


【解决方案1】:

触发器检测到更改,您需要使用它来触发存储过程。这是一个很好的教程:http://markalexanderbain.suite101.com/mysql-stored-procedures-and-triggers-a71091

或者,如果您使用 php、coldfusion 或其他中间层,您可以将记录读入变量。请删除该行,然后重新插入记录。但是你最好使用存储过程来完成这项工作。

【讨论】:

  • 问题不在于触发器或过程,而是一种在不删除父级的情况下进行级联删除的方法!
  • 您需要使用存储过程来完成。您已经有了触发器,编写一个存储过程来删除子表中的记录并从您的触发器中触发它。如果您问是否可以直接进行级联而不删除父级,那么答案是您不能。
【解决方案2】:

删除所有与父级关联的外键的子级..

authorname = Bill, authorid = 5

我们需要按账单删除所有书籍

DELETE FROM books WHERE authorid=5

编辑:对不起,重新阅读..您可以在状态的UPDATE 上实现此逻辑

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2011-06-29
    • 2010-10-05
    • 2011-09-21
    相关资源
    最近更新 更多