2013-02-22 46 views
0

如何將NEW/OLD數據放入沒有提交名稱的臨時表中。 我試圖創建觸發器,過程是這樣,但它失敗:MySQL如何將所有NEW/OLD觸發器數據放入臨時表並在過程中使用?

 

CREATE TRIGGER `after_insert` AFTER INSERT 
ON `master` 
FOR EACH ROW BEGIN 
    CREATE TEMPORARY TABLE after_insert_trigger_temp_table ENGINE=MEMORY 
    AS (SELECT NEW.*); 
    CALL after_insert_action(); 
END$$ 
 
 

CREATE PROCEDURE `after_insert_action`() 
BEGIN 
    INSERT INTO `slave` (`name`,`detail`) 
    SELECT `name`,`detail` FROM after_insert_trigger_temp_table; 
END$$ 
 

回答

3

你看,它說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$$ 
+0

嗯,謝謝你的回答。 我不記得我問了什麼,但我的問題 - 根本沒有意義。創造溫度。在每一行中的表格。 - - 「 – Zeigen 2014-07-01 09:33:54

相關問題