2012-01-15 78 views
0

我的代码很长,所以我会让它变得简单。 我有以下几点:是否有任何解决方案为MYSQL错误代码:1442?

table1 --> have a trigger on insert (call function1 to insert into table2) 
table2 --> have a trigger on insert (call function2) 

function2() 
update table1 depending on a query that table1 is related to. 

和我得到,因为它已经被用于通过调用这个语句错误不能在存储函数/触发更新表table1 ....

那么,有没有解决方案或解决方法...

+0

你是说table2上的触发器将记录插入到table1中? – 2012-01-15 18:42:44

+0

不,它正在运行一个函数来更新table1 – 2012-01-15 18:57:24

+0

当实际代码很大时(实际上,只要您发布代码),您总是可以生成一个[minimal sample case](http://sscce.org/)的模糊图。 – outis 2012-01-16 01:21:30

回答

1

要理解触发器的事情是他们是交易的一部分。

因此,插入表1,触发插入更新table1的表2,可能会导致原始插入自身碰撞。没有完成与MySQl的触发器,理论上这可能是好的,如果它试图更新最初插入的记录,其实际上还没有提交......

尝试并避免这种情况是通常的最佳建议,然而,如果你不能,一个中间表可能会工作(插入到表中并让它触发对表1和2的更改),或者更好的是,而不是使用直接插入,使用存储过程并使其更新表1 & 2 cummulativley。

例如取而代之的是插入Table1 = A,这导致Table2 = B导致Table1(A)变为C ,SP查找B对A做什么并将其插入到A(c)中并将其插入到B中的对应记录中。

触发器很棒,但不要对他们生气。

+0

好吧,我喜欢中间表的想法,但我想如果我插入需要更新的表中的值,并创建一个触发器来更新table1,更新仍然是交易的一部分,它将是同样的问题。 – 2012-01-16 08:20:07

+0

必须有足够的数据/逻辑在中间'工作'应该在表1和2中应该去。因此插入到中间触发器插入到deopendant表,他们不会触发对方。我更喜欢sp解决方案,它更多的是在你的面前,你可以设置权限,只有SP可以插入到任何一个表中,尽管如果逻辑变得更复杂或者变得更复杂,这可能会导致额外的工作。 – 2012-01-16 17:39:03

相关问题