mysql - SQL 触发器从数据库中删除行

标签 mysql triggers

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

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

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 结束。

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

干杯!

关于mysql - SQL 触发器从数据库中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4673900/

相关文章:

MySQL:产品、属性、库存水平

mysql - 在 mysql 表中存储组成员的最佳方法

mysql - 我应该使用哪种类型的连接?

mysql - 如何在 mysql 中执行删除级联?提供的示例

postgresql - 级联触发器不起作用

tsql - 同步两个表,最佳实践

triggers - 每次使用Quartz.NET都会出现错误

mysql - 性能问题 MySQL 5.7

mysql - ADOdb.connection.execute "create table"通过 MSAccess 与 Mysql 后端问题

Azure存储Blob触发器没有唤醒休眠功能