我有两个表和一个触发器。表传感器上的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;
答案 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。