【问题标题】:loops and conditionals inside triggers触发器内的循环和条件
【发布时间】:2011-01-31 02:22:51
【问题描述】:

我想将这段逻辑实现为触发器,但我不知道该怎么做!我想创建一个触发器,当删除一行时,它会检查其中一个列的值是否存在于另一个表中,如果存在,它还应该基于另一列对另一个表执行删除。

假设我们有一个包含列 Bar、Baz 的表 Foo。如果我不使用触发器,这就是我正在做的事情:

function deleteFromFooTable(FooId)
{
  SELECT (Bar,Baz) FROM FooTable WHERE id=FooId
  if not-empty(SELECT * FROM BazTable WHERE id=BazId)
    DELETE FROM BarTable WHERE id=BarId

  DELETE FROM FooTable WHERE id=FooId

}

我在那个伪代码中跳了一些圈,但我希望你们都明白我要去的地方。看来我需要的是一种在触发器语句中执行条件和循环(在多行删除的情况下?)的方法。到目前为止,我还没有找到任何东西。这是不可能的,还是这是不好的做法?谢谢!

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    如果您没有在这些表之间设置外键关系,则需要这样做。我将向您展示创建表时设置所需内容的命令。显然,您只需要更新表格。

    CREATE TABLE foo (id INT, bar_id INT,
        FOREIGN KEY (bar_id) REFERENCES bar(id)
            ON DELETE CASCADE
    ) ENGINE=INNODB;
    

    这将在删除 Foo 记录时删除所有“孤儿”。

    【讨论】:

    • 感谢凯文,这几乎可以满足我的需求,除了我是否删除它取决于它是否被另一个表引用。我该怎么做?
    • @Ying 这就是应该做的。它只会在没有被另一个表引用的情况下删除一些东西。
    猜你喜欢
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    相关资源
    最近更新 更多