2013-11-27 165 views
0

我正在嘗試創建一個觸發器,但是我不斷收回語法錯誤。MySQL觸發器創建。我的觸發器有什麼問題?

這裏的語句:

DELIMITER $$ 

CREATE TRIGGER `swtalentbank`.`after_candidate_insert` 
    AFTER INSERT ON `Candidates` FOR EACH ROW 
    BEGIN 
     INSERT INTO useradmin (username, talent) 
     VALUES (NEW.email, 1); 
    UPDATE `Candidates` SET UserID = useradmin.userid where useradmin.username = NEW.email; 
    END 

DELIMITER ; 

我有一個登記表上我的網站。當一個人註冊時,用他們的個人資料信息填充候選人表。

在候選人表中,有各種字段,其中兩個是'email''UserID'UserID is also the PK in 'useradmin',所以我把這兩個連起來。

因此,當用戶註冊時,我需要在'useradmin'中插入一個記錄,其中包含剛剛用於註冊的電子郵件地址,然後更新'Candidates'表,其中包含'useradmin' 。

我希望這有道理嗎?

注意:在運行語句之前,我正在更改分隔符。

回答

0

您應該在結束插入查詢後使用分號。

創造你與你當前的代碼至少兩個基本問題觸發時,您可以使用INSERT ... ON DUPLICATE KEY UPDATE語法的目的

+0

剛添加的。我更新了我的問題,以顯示我正在運行的內容。 – Mcam435

0

嘗試這個...

DELIMITER $$ 

CREATE TRIGGER `swtalentbank`.`after_candidate_insert` 
    AFTER INSERT ON `Candidates` FOR EACH ROW 
    BEGIN 
     INSERT INTO useradmin (username, talent) 
     VALUES (NEW.email, 1); 
    UPDATE `Candidates` SET UserID = useradmin.userid where useradmin.username = NEW.email; 
    END $$ 

DELIMITER ; 
+0

謝謝,雖然我現在得到這個:'#1064 - 你的SQL語法有錯誤;檢查對應於您的MySQL服務器版本的手冊,以在'第7行'處使用'$$ DELIMITER' – Mcam435

1

除了正確使用DELIMITER

  1. 在MySQL中,您不能使用針對表(candidates)的DML語句(在您的案例中爲UPDATE)您定義了一個觸發器(也是candidates)。您的只有選項是使用BEFORE觸發器並將行的值設置爲userid插入正確的值。
  2. 您不能像在您的UPDATE中那樣任意引用某個表的列(useradmin.userid)。您沒有加入useradmin表或在子查詢中使用它。

話雖這麼說,並假設useriduseradmin表是一個auto_increment列的觸發可能是這樣

DELIMITER $$ 
CREATE TRIGGER after_candidate_insert 
BEFORE INSERT ON candidates 
FOR EACH ROW 
BEGIN 
    INSERT INTO useradmin (`username`, `talent`) VALUES (NEW.email, 1); 
    SET NEW.userid = LAST_INSERT_ID(); 
END$$ 
DELIMITER ; 

下面是SQLFiddle演示