2016-06-20 22 views
0

我一直有这个问题。当然,这是我所做过的第一个触发器(对此很新颖)。我认为这是一个格式问题。我有一张名为filleradown的表。我需要插入一条记录来检查新行中的B3_4_5的值是否为1.如果是我需要它然后运行select来查找B3_4_5是0的最后一个条目。然后更新NEW .stoptime值是最后0条记录的'时间'值。MYSQL触发器获取最后一行值并设置

我想我有所有的部分,但似乎无法让它运行。请帮忙。

DELIMITER $$ 
CREATE TRIGGER downinsert 
BEFORE INSERT ON 'filleradown' FOR EACH ROW BEGIN 
DECLARE downtime DATETIME; 
IF (NEW.B3_4_5 = '1') THEN 
    SELECT time INTO downtime FROM filleradown WHERE B3_4_5 = 0 ORDER BY time DESC LIMIT 1; 
    SET NEW.stoptime = downtime; 
END IF 
$$ 
DELIMITER ; 

更新:我在这里得到了更好的代码,但仍然出现一些错误。

DELIMITER $$ 
CREATE TRIGGER downinsert BEFORE INSERT ON filleradown 
FOR EACH ROW 
BEGIN 
DECLARE dt DATETIME; 
IF NEW.B3_4_5 = '1' THEN 
SELECT MAX(time) INTO dt FROM filleradown WHERE filleradown.B3_4_5 = 0; 
SET NEW.stoptime = dt; 
END IF 
$$ 
DELIMITER ; 

我得到的错误

1064 - 你在你的SQL语法错误;检查对应于您的MariaDB服务器版本的手册,以找到在第8行“'附近使用的正确语法。

+0

你得到什么错误?另外,你的'select'查询是不理想的。你希望像'SELECT MAX(time)AS downtime FROM filleradown WHERE B3_4_5 = 0'这样的东西,因为它摆脱了'LIMIT,OFFSET'开销。 –

+0

@ N.B。更新了主帖。我一直在修改它 –

+0

再次更新是缺少分隔符 –

回答

0

修复了它。字面上错过了END语句。 捂脸

DELIMITER $$ 
CREATE TRIGGER downinsert BEFORE INSERT ON filleradown 
FOR EACH ROW 
BEGIN 
DECLARE dt DATETIME; 
IF NEW.B3_4_5 = '1' THEN 
    SELECT MAX(time) INTO dt FROM filleradown WHERE filleradown.B3_4_5 = 0; 
    SET NEW.stoptime = dt; 
END IF; 
END $$ 
DELIMITER ;