2010-03-01 45 views
3

我正在使用mysql,并且有批量插入到我的表中。 我的疑问是,如果我创建一个指定after insert的触发器,那么触发器将被激活,每个insert after,我不想发生。如何在mysql中的所有批量插入之后激活触发器

在完成所有批量插入操作后,是否有任何方法来激活触发器?

有什么建议吗?

谢谢。

+0

Postgresql已经发送触发器,不知道是否MySQL提供他们,但。 – ChristopheD 2010-03-01 13:52:16

+0

mysql确实提供了触发器。 – JPro 2010-03-01 13:54:29

+0

从Mysql文档:“InnoDB立即检查外键约束;检查不会延迟到事务提交。”所以它的存储引擎依赖于 – 2010-03-01 14:09:57

回答

1

如果您担心的是性能问题,您可以放心,操作速度非常快,即使它是分别在每个插入的行上执行的。但如果您真的认为这会导致性能问题,那么您应该进行配置。

我能想到的单一替代方案是放弃触发器,执行插入查询并重新添加触发器,这实际上是一个可怕的解决方案(不幸的是,您无法禁用MySQL中会话的触发器 - 实际上,您无法禁用他们根本)。

+0

更新了问题 – JPro 2010-03-01 13:58:02

0

触发语法(>>插入< <后)固有地表示将为每个插入操作完成。我不知道有什么方法可以解决这个问题。一个可能的解决方法可能是在插入语句中有一个标志(某列的某个魔术值,例如-200列的id列),只有在最后一次插入时才为真,然后有一个if语句在触发器中检查国旗。虽然感觉有点像黑客。也许你可以给我们更多的背景,可能有更好的方法去剥皮这只猫。

+0

一些外部源批量更新我的数据库,我想根据它提供的值填写一些额外的文件,这对于同一张表。我虽然它可能会导致冲突,当触发器被激活并尝试更新表,而另一个插入正在进行的同一张表。有任何想法吗? – JPro 2010-03-01 13:53:33

+0

没有文档证实这一点,但触发器可能会在插入下一行之前完成其工作。即使没有,MySQL也会为你处理锁定。 Innodb支持行级锁定,这意味着如果一个线程忙于更新一行,其他人将无法更新它。不要以为你不必担心冲突。你是否想要更新触发器被激活的同一行中的字段?是否要插入/更新另一行? – 2010-03-01 14:13:43

+0

它给出了以下错误:错误:ODBC:状态S1000:[MySQL] [ODBC 5.1驱动程序] [mysqld-5.1.37]无法更新存储的函数/触发器中的表'my_table',因为它已被语句调用这个存储的函数/触发器。 – JPro 2010-03-01 14:27:52

2

看看here,看看你是否可以实现这一招,基本上包装扳机if语句由你可以打开一个变量,并关闭

if (@DISABLE_TRIGER <> 1) then 
#trigger body 
end if; 

,如果你想禁止触发器比控制在进口只是:

SET @DISABLE_TRIGER = 1; 

#do imports 

SET @DISABLE_TRIGER = 0;