你看,它說FOR EACH ROW
部分...
聲明如下FOR EACH ROW
定義語句每次觸發器激活時執行,其中對於受觸發語句影響的每個行發生一次。 - http://dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html(強調)
所以,你提出要建立一個新的臨時表對於被插入到表與觸發器,莫名其妙地訪問所有的列與NEW
每一行。 *
用於插入到該表中,然後調用存儲過程,並通過從該臨時表中選擇兩個列來插入到不同的表中,該列可能是您知道的原始表中的兩列。在某些時候,臨時表當然需要消失,因爲如果在一個查詢中或一個會話中向表中插入多於一行的行,那麼您將嘗試創建一個臨時表,其名稱與一個已由您的會話擁有。
我從來沒有遇到OLD。*或NEW。*觸發器或文檔中的catchalls,無論如何,它不完全清楚你想要完成什麼,除了可能避免輸入兩個列名或可以在不更新此觸發器的情況下更改您使用存儲過程跟蹤的內容。
但是,您需要記住觸發器的一個關鍵設計因素是它們應該儘可能有效地儘可能少地執行,因爲如果您不遵守此規則,它們很有可能成爲性能問題。
一對夫婦的替代方法浮現在腦海中,因爲基於問題的詳細臨時表是沒有意義的:
選項1:
CREATE TRIGGER `after_insert` AFTER INSERT ON `master` FOR EACH ROW
BEGIN
INSERT INTO `slave` (`name`,`detail`) VALUES (NEW.`name`,NEW.`detail`);
END $$
選項2:
CREATE TRIGGER `after_insert` AFTER INSERT ON `master` FOR EACH ROW
BEGIN
CALL after_insert_action(NEW.`name`,NEW.`detail`);
END $$
CREATE PROCEDURE `after_insert_action`(in new_name TEXT, in new_detail TEXT)
# you may want to use more appropriate datatypes instead of TEXT
# but this should work as written as long as those columns are no larger than TEXT
BEGIN
INSERT INTO `slave` (`name`,`detail`) VALUES (new_name, new_detail);
END$$
嗯,謝謝你的回答。 我不記得我問了什麼,但我的問題 - 根本沒有意義。創造溫度。在每一行中的表格。 - - 「 – Zeigen 2014-07-01 09:33:54