2012-08-30 133 views
0

我無法獲得以下代碼以使用此page作爲參考以及此站點上的其他帖子。我需要創建一個觸發器,只要表A被更新,它就會在表B中插入一條記錄。下面的代碼顯示了我正在嘗試的內容;但是這會產生語法錯誤(#1064)。我還不清楚我是否需​​要包含'DELIMITER $$'語法。我感謝你的幫助MySQL觸發器將表A中的記錄插入表B

DELIMITER $$ 
CREATE TRIGGER MyTrigger 
AFTER INSERT 
ON TableA 
FOR EACH ROW 
BEGIN 
    INSERT INTO TableB SET 
    TableA_id = NEW.TableB_id, 
    TableA_date = NEW.TableB_date, 
    TableA_comment = NEW.TableB_comment; 
    END; 
END $$ 
DELIMITER ; 

編輯:在僞代碼上面,我是用$ TableName_ $字段名慣例,表明A列屬於表A,B列屬於表B.我應該有在我原來的問題中更加明確。有人在下面評論我在錯誤的一面有NEW指標(應在表A中),但該評論似乎已被刪除。有人可以確認嗎?感謝您的幫助

+0

在回答您的編輯:你是說在'TableB'你*不*有一個叫做'TableA_id'列,而是要插入一行到' TableB',使得TableB.TableB_id的值等於TableA.TableA_id的值等等。 – eggyal

+0

@eggyal TableB由TableB_id,TableB_date和TableB_comment組成;同樣對於Tabel A.對不起,我的原始問題沒有更清楚。我基本上想要在表A更新時在表B中插入相同的記錄 – Arkady

+1

在這種情況下,您確實需要在您的INSERT語句中顛倒列名。 'SET TableB_id = NEW.TableA_id'等。 – eggyal

回答

1

試試這個:

DELIMITER $$ 
CREATE TRIGGER MyTrigger 
AFTER INSERT 
ON TableA 
FOR EACH ROW 
BEGIN 
    INSERT INTO TableB SET 
    TableB_id = NEW.TableA_id, 
    TableB_date = NEW.TableA_date, 
    TableB_comment = NEW.TableA_comment; 
END $$ 
DELIMITER ; 

這裏的DELIMITER用來告訴MySQL對待所有以下;作爲定義的一部分,而不是實際的命令終止。

請注意,我剛剛閉幕END $$

+0

你如何知道'TableB'中的列名? – eggyal

+0

這是什麼意思?他在寫查詢的時候現在已經有了列名,但是如果他想要使用類似UPDATE的sintax進行插入,在左側他必須有TableB的列名,並且在那個位置他將他想要的值從新插入TableA的一行。我真的不明白你的失望,對我來說沒有意義! –

+0

我的意思是,你已經將列名改爲OP以外的內容。你怎麼比他知道他的桌子上的柱子的名字是什麼?無論如何,這並不能解釋#1064語法錯誤。但是,由於您已經刪除了錯誤的「END」,因此您的答案現在提示解決問題的方法,並且已刪除我的downvote。也就是說,你的評論「*我認爲你在插入錯誤的字段*」會將注意力轉移到實際問題上,並且在列名恢復之前觸發器可能無法工作。 – eggyal

1

之前卸下了無與倫比的END;您的觸發錯誤END;(每END應該配搭BEGIN)。

對於這個問題,甚至不需要BEGIN ... END塊,因爲觸發器只包含一條語句(如果該塊被省略,則甚至不需要更改語句分隔符,因爲不會出現分號CREATE TRIGGER發言):

CREATE TRIGGER MyTrigger AFTER INSERT ON TableA FOR EACH ROW 
    INSERT INTO TableB SET 
    TableA_id = NEW.TableB_id, 
    TableA_date = NEW.TableB_date, 
    TableA_comment = NEW.TableB_comment 
相關問題