2011-05-18 101 views
20

我在MySQL中有表“A”。它有一些对其他表格(“B”,“C”,“D”...)进行级联删除的参考。当某些东西从“A”删除时,我需要使用触发器。当我直接从“A”删除记录时,此触发器起作用。但它不适用于级联删除。 是否有任何版本的MySQL存在的地方我的触发器将与级联删除工作?或者,也许,还有另一种方式来调用级联删除触发器调用

+1

这是在应用程序代码中执行逻辑的一个参数,而不是触发器和级联的复杂设置。 – 2016-04-30 18:56:26

回答

22

http://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html

级联外键的动作不激活触发器

换句话说,你不能用级联删除使用触发器。

+37

我每天讨厌mysql更多 – 2012-04-16 19:47:08

+1

是的,他们在过去的5年里没有做任何修复。 – boreq 2012-10-09 12:57:13

+1

我刚刚发现这个问题,它是超级愚蠢的:-( – 2015-04-04 05:48:45

4

总结从@Niel德威特和@Browny林答案:

  1. 可悲的是级联删除不会在MySQL激活触发器。
  2. 一种解决方案是不使用级联删除,而是通过另一个触发器实现自动删除。
+1

使用另一个删除触发器不是一个合适的方法,因为如果我在tableA上有一个触发器并且在tableB中删除了一行,并且如果我有一个触发器aon tableB用于更新tableA, – Shafizadeh 2015-09-18 21:05:16

-2
CREATE TABLE doc (
docID INTEGER NOT NULL AUTO_INCREMENT, 
langCode CHAR(2) NOT NULL, 
title VARCHAR(32), 
PRIMARY KEY (docID, langCode) 
) Type=InnoDB; 

CREATE TABLE author (
authorID INTEGER NOT NULL AUTO_INCREMENT, 
docID CHAR(2) NOT NULL, 
name VARCHAR(32), 
PRIMARY KEY (authorID), 
FOREIGN KEY (docID) REFERENCES doc(docID) ON DELETE CASCADE ON UPDATE CASCADE 
) Type=InnoDB; 
+1

这是http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html的评论的直接副本。 – hichris123 2016-05-03 23:31:05

+1

这似乎没有试图回答日一切问题。 – Pang 2016-10-31 06:10:36

1

让我分享如何我已经从第一天开始,我发现它的存在“修复”这个问题。我将级联表中的触发器复制到直接删除的第一个表中。它只是工作。

很多时候这是复制/粘贴的问题,偶尔它需要大量重写代码。

最好的部分是,当Oracle最终修复此问题时错误您只能从上述表中删除触发器代码。瞧!