2011-11-09 188 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