2011-08-11 207 views
2

我的語法有什麼問題?mysql觸發器插入

CREATE 
    TRIGGER db_dhruniversity.trigger1 
    AFTER INSERT 
    ON jos_dhruprofile 
    FOR EACH ROW 
BEGIN 
UPDATE jos_users 
    SET jos_users.department = jos_dhruprofile.department 
    WHERE jos_users.id = jos_dhruprofile.uid 
END 
+1

你能顯示編譯錯誤信息嗎? – heximal

回答

2

沒有分隔符在它:

DELIMITER || 

CREATE 
    TRIGGER db_dhruniversity.trigger1 
    AFTER INSERT 
    ON jos_dhruprofile 
    FOR EACH ROW 
BEGIN 
UPDATE jos_users 
    SET jos_users.department = NEW.department 
    WHERE jos_users.id = NEW.uid; 
END || 

DELIMITER; 
+0

我想我的邏輯是什麼不工作.. – Tony77

+0

也許告訴我們你想達到什麼呢? – Mchl

+0

我有兩個表,一個叫 USERPROFILE另一種是所謂的用戶 每當一個新的記錄插入USERPROFILE我想更新表「用戶」 這個樣機結構 表-userprfile ID UID 名 部門 表用戶 ID 名 電子郵件 部門(想從userprofiletable上的每個INSERT,UPDATE,這個領域) 現在,表userprofile匹配uid = id上的用戶,沒有contratins或外鍵,我可能需要,不確定,,, 我該怎麼做。在此先感謝..... – Tony77

4

的語法應該如下:

DELIMITER $$ /* if you're not using an editor, you must change the delimiter*/ 

CREATE 
    TRIGGER ai_jos_dhruprofile_each 
    AFTER INSERT 
    ON jos_dhruprofile 
    FOR EACH ROW 
BEGIN 
    UPDATE jos_users 
    SET jos_users.department = NEW.department 
    WHERE jos_users.id = NEW.uid; /*<<<--- ; after every stament */ 
END $$ /* changed delimiter after the end */ 

DELIMITER ; /*make sure you set the delimiter back to the default*/ 

注意的命名方案觸發
我建議命名你的觸發器ai(意思是after insert),所以你知道它什麼時候觸發哪張桌子,而不是一個毫無意義的名字,如:db_dhruniversity.trigger1
我總是使用[A/B] + [d/I/U] _tablename_each作爲triggername,這樣我總是知道何時觸發器觸發(前/後)其事件(插入/刪除/更新)和哪個表。

還有一個很好的做法是記錄觸發器在each行上觸發,因此在觸發器名稱末尾觸發each

請注意,MySQL不支持觸發器,每個語句觸發一次(但這可能會在將來改變)。