2011-01-12 28 views
4

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

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

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 

我的问题是,第二个触发不会出现运行,如果是这样,第二触发器不会从数据库中删除任何行。

所以这里的问题是:为什么我的第二个触发器没有做我期望的事情?

回答

5

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

在存储函数或触发器, 没有许可由语句来修改已被使用的表 (用于 读取或写入)调用函数或触发器的 。

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

alarms已被调用触发器(插入)的语句使用。这基本上意味着您不能使用删除触发器修改alarms

干杯!

+0

太棒了。谢谢!我希望将所有内容都保存在SQL中,但我想我会设置一个cron作业来定期清除数据库:) – wpearse 2011-01-12 22:36:41