2011-11-09 164 views
1

我正在使用MYSQL服务器版本:5.5.16并且建立我的第一个触发器非常困难。希望在更新表时更新基于表中其他值的变量。下面的代码生成语法错误...#1193 - 未知的系统变量“状态”语法错误定义MYSQL触发器

CREATE TABLE `peakstat` (
    `peakuid` int(11) NOT NULL AUTO_INCREMENT, 
    `status` varchar(20) , 
    `scheddate` date , 
    `summitdate` date , 
PRIMARY KEY (`peakuid`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; 

,并建立了扳机......

delimiter $$ 
drop TRIGGER if exists addstatus $$ 
CREATE TRIGGER addstatus 
AFTER UPDATE ON peakstat 
    FOR EACH ROW 
    BEGIN 
     IF peakstat.summitdate > 0 THEN 
       set peakstat.status = "CLIMBED"; 
     ELSEIF peakstat.scheddate > NOW() THEN 
       set peakstat.status = "SCHEDULED"; 
     END IF; 
    END;$$ 
DELIMITER ; 
+0

包裹带回蜱' – diEcho

+0

澄清:的[MySQL的'peakstat'.'status' – LeleDumbo

+0

可能重复插入后和更新后触发](http://stackoverflow.com/questions/843031/mysql-after-insert-and-after-update-trigger) –

回答

0
  1. 您应该使用新的或旧的条款,而不是表名。例如'IF peakstat.summitdate> 0 THEN'必须是这样的 - '如果NEW.summitdate> 0 THEN',等等......

  2. 不可能在AFTER中更新已触发表的记录更新触发器,将其更改为BEFORE UPDATE。

最后,我们有这样的事情:

DELIMITER $$ 

DROP TRIGGER IF EXISTS addstatus$$ 

CREATE TRIGGER addstatus 
BEFORE UPDATE ON peakstat 
FOR EACH ROW 
BEGIN 
    IF NEW.summitdate > 0 THEN 
    SET NEW.status = 'CLIMBED'; 
    ELSEIF NEW.scheddate > NOW() THEN 
    SET NEW.status = 'SCHEDULED'; 
    END IF; 
END$$ 

DELIMITER ; 
+0

我想这个,但不断收到'未知的系统变量'test_var',任何想法是怎么回事? –

+0

我的代码中没有使用变量'test_var'。检查你的解决方案 – Devart