2015-03-31 75 views
0

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

测量

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; 
+0

失败**如何**? – 2015-03-31 15:12:29

+0

@OP:将错误堆栈详细信息添加到您的帖子。 – 2015-03-31 15:13:37

+0

失败在于记录未插入表格度量中。 – 2015-03-31 15:21:18

回答

0

也有一些是在文档中,你可能会感兴趣的:
https://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html

在BEFORE触发器,对于AUTO_INCREMENT列的新值是0, 不是序列即自动时所生成的数字新插入的 行。

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

+0

感谢您的回答,但事实并非如此。我在'if new.distance zp'子句中添加了'ELSE'语句,其中我在另一列中添加了zp的值(删除了UPDATE),并且显示zp的值确实在评估IF /然后。 – 2015-04-01 07:31:33