mysql – 用于从数据库中删除行的SQL触发器

我有一个工业系统,可以将报警记录到远程托管的MySQL数据库.只要警报的属性发生变化(例如,警报被激活,确认或关闭的时间),工业系统就会在名为“警报”的表格中插入新行.

我不希望每个警报有多个记录,所以我设置了两个数据库触发器.第一个触发器将每个新记录镜像到第二个表,根据需要创建/更新行.第二个表(‘alarm_display’)将’Tag’列设置为主键. ‘alarm’表没有主键.此触发器的代码是:

CREATE TRIGGER `mirror_alarms` BEFORE INSERT ON `alarms`
  FOR EACH ROW 
    INSERT INTO `alarm_display` (Tag,...,OffTime) 
    VALUES (new.Tag,...,new.OffTime) 
    ON DUPLICATE KEY UPDATE OnDate=new.OnDate,...,OffTime=new.OffTime

第二个触发器应在第一个触发器之后执行,并且(理想情况下)从警报表中删除所有行. (我使用了警报的Tag属性,因为Tag属性永远不会改变,虽然我怀疑我可以使用’DELETE FROM alarms WHERE 1’语句来达到相同的效果).

CREATE TRIGGER `remove_alarms` AFTER INSERT ON `alarms`
  FOR EACH ROW DELETE FROM alarms WHERE Tag=new.Tag

我的问题是第二个触发器似乎没有运行,或者如果它运行,第二个触发器不会从数据库中删除任何行.

所以这就是问题:为什么我的第二次触发不能达到我的预期呢?

解决方法:

可以在这里阅读解释:http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html

Within a stored function or trigger,
it is not permitted to modify a table
that is already being used (for
reading or writing) by the statement
that invoked the function or trigger.

这是您的问题,您的触发器以#1442错误结束.

表警报已被调用触发器的语句(插入)使用.这实际上意味着您无法使用删除触发器修改警报.

干杯!

上一篇:linux – 在PostgreSQL函数中使用参数运行系统命令


下一篇:mysql – 允许/只需要一个具有公共FK的记录具有“主”标志