mySQL触发器在UPDATE语句上失败

时间:2015-03-31 15:06:56

标签: mysql triggers

我有两个表和一个触发器。表传感器上的UPDATE触发器失败。我已经测试了触发器更新另一个表,并且工作正常,所以我希望这是锁定传感器的问题。我当然不是mySQL的专家,我做了一些搜索。我试图在触发器中的第一个SELECT之前添加SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;,但这没有任何区别。

测量

CREATE TABLE `measurements` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `sensorid` int(16) DEFAULT NULL,
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `distance` int(11) NOT NULL,
  `temperature` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26727 DEFAULT CHARSET=latin1;

传感器

CREATE TABLE `sensors` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` char(32) DEFAULT '',
  `zeropoint` int(11) unsigned DEFAULT NULL,
  `threshold` int(11) unsigned DEFAULT NULL,
  `hysteresis` int(11) DEFAULT NULL,
  `status` enum('normal','alarm') DEFAULT 'normal',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

触发提升 闹钟

CREATE TRIGGER `raise alarm` BEFORE INSERT ON `measurements`
FOR EACH ROW
begin
    declare zp integer;
    declare st char(32);
    select zeropoint into zp from sensors where id = new.sensorid;
    select status into st from sensors where id = new.sensorid; 
    if new.distance > zp then
        if st = 'normal' then
            update sensors set status = 'alarm' where id = new.sensorid;
        end if;
    end if;
end;

1 个答案:

答案 0 :(得分:0)

文档中有一些您可能感兴趣的内容:
https://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html

  

在BEFORE触发器中,AUTO_INCREMENT列的NEW值为0,   不是新的时候自动生成的序列号   实际插入了行。

这意味着,触发器中的所有查询始终都在查找id = 0的记录,因为测量表中的id列是自动递增的。
如果传感器表中没有记录id = 0,则zp变量为null,并且此条件:if new.distance > zp then始终为false。