2015-03-31 34 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