2012-07-16 133 views
1

之前選擇整個[新]行我有一個包含觸發此:在插入觸發器MySQL的

SET v1 = CONCAT_WS(',',NEW.ID, NEW.Name, NEW.Type, NEW.Value); 

這能簡化到像這樣包括整個新行?:

SET v1 = CONCAT_WS(',',NEW.*); 

(我試過上述變化但它們會導致語法錯誤)

感謝

+0

如果我能弄清楚如何從觸發器內執行預備語句,請參閱我的相關問題:http://stackoverflow.com/q/11514713/1224615 – user1224615 2012-07-17 01:03:29

回答

0

不,沒有簡單的方法來做到這一點。你必須引用每一列。

唯一真正的解決方法是使用表元數據來幫助您生成所需的語句,然後將該語句包含在您的過程中。

即使可能,您也不希望在TRIGGER中動態執行此操作。

SELECT CONCAT('NEW.`',GROUP_CONCAT(c.column_name 
     ORDER BY ORDINAL_POSITION SEPARATOR '`,NEW.`'),'`') 
    FROM information_schema.columns 
WHERE table_schema = DATABASE() 
    AND table_name = 'mytable' 

這應該讓你一個字符串,它看起來像:

NEW.`ID`,NEW.`Name`,NEW.`Type`,NEW.`Value` 

你可以粘貼到您的觸發器主體。 (當然,你可以擴展CONCAT來生成整個行)。

不利的一面是,當新列被添加到表中時,這些列將不會自動包含;這將需要改變觸發器。如果列被刪除或重命名,觸發器將開始拋出異常;再次需要修復觸發器。


UPDATE

問:我怎樣才能轉換這個字符串轉換成MySQL查詢?

@query = "CONCAT_WS(',','CCC','64',NEW.Record,NEW.ID,NEW.Name,NEW.User_ID,NEW.State_Record,NEW.Hash);" 

我不會將其轉換爲查詢。我只是將它用作觸發器正文中的靜態代碼行(不帶雙引號),就像您在TRIGGER中的原始語句一樣。

SET v1 = CONCAT_WS(',','CCC','64',NEW.Record,NEW.ID,NEW.Name,NEW.User_ID,NEW.State_Record,NEW.Hash); 

(目前還不清楚是什麼你打算與該字符串做)。

如果你想創建一個SELECT語句,你可以嘗試從字符串末尾去除分號,並在其上添加一個SELECT關鍵字。但我不認爲新。在該上下文中將會識別對當前行的列值的引用。這可能會發生,但你需要測試。

如果我需要做這樣的事情,我會使用用戶變量做到這一點,

SET @new_id = NEW.ID; 
SET @new_name = NEW.Name; 

SELECT @new_id, @new_name 

這不是在所有我清楚你打算通過類似的查詢返回的結果集做什麼。如果您正試圖改變審計的表,規範模式運行的列值的插入到一個更新日誌表,

INSERT INTO mytable_changelog (ID, Name) VALUES (NEW.ID, NEW.Name); 

這真的取決於你所要完成的任務。

+0

嗨,感謝您的回覆。基於此,我設法生成了我需要的查詢字符串並將其分配給一個變量,但我怎樣才能將其轉換爲MySQL查詢? @query =「CONCAT_WS(',','CCC','64',NEW.Record,NEW.ID,NEW.Name,NEW.User_ID,NEW.State_Record,NEW.Hash);」 – user1224615 2012-07-17 00:30:05