2012-11-21 87 views
4

有人可以告訴我我的代碼的語法有什麼問題嗎? (這是我所強調和運行,所以行號應匹配的準確和唯一的代碼)創建觸發器時出現語法錯誤,出了什麼問題?

CREATE TRIGGER `trg_part_upd` AFTER UPDATE ON `tbl_sub_model_eng_trans_part` 
FOR EACH ROW 
    if NEW.engine_sk = 0 and NEW.trans_sk = 0 
    then 
     UPDATE tbl_sub_model tsm 
     INNER JOIN tbl_fct_sub_eng_trans tfset ON tsm.sub_model_sk = tfset.sub_model_sk 
     INNER JOIN tbl_sub_model_eng_trans_part tsmetp ON tfset.trans_sk = tsmetp.trans_sk 
     SET tsm.last_modified_date = NOW() 
     WHERE tsmetp.sub_model_sk=NEW.sub_model_sk; 
    end if; 

我得到這兩個錯誤:

錯誤代碼:1064你在你的SQL有一個錯誤句法;請檢查與您的MySQL服務器版本相對應的手冊,以便在第9行的''附近使用正確的語法。

錯誤代碼:1064.您的SQL語法錯誤;檢查對應於你的MySQL服務器版本正確的語法使用附近的手冊「結束,如果」第1行

回答

9

你忘了更改分隔符,因此MySQL認爲你的第一個說法是這樣的:

CREATE TRIGGER `trg_part_upd` AFTER UPDATE ON `tbl_sub_model_eng_trans_part` 
FOR EACH ROW 
    if NEW.engine_sk = 0 and NEW.trans_sk = 0 
    then 
     UPDATE tbl_sub_model tsm 
     INNER JOIN tbl_fct_sub_eng_trans tfset ON tsm.sub_model_sk = tfset.sub_model_sk 
     INNER JOIN tbl_sub_model_eng_trans_part tsmetp ON tfset.trans_sk = tsmetp.trans_sk 
     SET tsm.last_modified_date = NOW() 
     WHERE tsmetp.sub_model_sk=NEW.sub_model_sk; 

代碼之前就補充一點:

DELIMITER $$ 

...事後這一點:

$$ 

...所以MySQL可以將完整的觸發器識別爲單個語句。

您可以根據自己的選擇更換$$

官方文檔在Defining Stored Programs部分給出了相關細節。

0

嘗試:

DELIMITER $$ 
CREATE TRIGGER `trg_part_upd` AFTER UPDATE ON `tbl_sub_model_eng_trans_part` 
FOR EACH ROW BEGIN 
    IF NEW.engine_sk = 0 AND NEW.trans_sk = 0 
    THEN 
     UPDATE tbl_sub_model tsm 
     INNER JOIN tbl_fct_sub_eng_trans tfset ON tsm.sub_model_sk = tfset.sub_model_sk 
     INNER JOIN tbl_sub_model_eng_trans_part tsmetp ON tfset.trans_sk = tsmetp.trans_sk 
     SET tsm.last_modified_date = NOW() 
     WHERE tsmetp.sub_model_sk=NEW.sub_model_sk; 
    END IF; 
    END; 
$$ 

DELIMITER ; 
0

觸發是一個源對象,它具有主體 - 一個或多個內部的語句。

  • 如果body中有一些語句,則body必須用BEGIN ... END子句包裝。在這種情況下,您可能還需要爲CREATE TRIGGER使用客戶端DELIMITER命令。
  • 如果您在正文中有一條語句,那麼您可以使用沒有BEGIN ... END的語法,並且不使用DELIMITER命令。