之前選擇整個[新]行我有一個包含觸發此:在插入觸發器MySQL的
SET v1 = CONCAT_WS(',',NEW.ID, NEW.Name, NEW.Type, NEW.Value);
這能簡化到像這樣包括整個新行?:
SET v1 = CONCAT_WS(',',NEW.*);
(我試過上述變化但它們會導致語法錯誤)
感謝
之前選擇整個[新]行我有一個包含觸發此:在插入觸發器MySQL的
SET v1 = CONCAT_WS(',',NEW.ID, NEW.Name, NEW.Type, NEW.Value);
這能簡化到像這樣包括整個新行?:
SET v1 = CONCAT_WS(',',NEW.*);
(我試過上述變化但它們會導致語法錯誤)
感謝
不,沒有簡單的方法來做到這一點。你必須引用每一列。
唯一真正的解決方法是使用表元數據來幫助您生成所需的語句,然後將該語句包含在您的過程中。
即使可能,您也不希望在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);
這真的取決於你所要完成的任務。
嗨,感謝您的回覆。基於此,我設法生成了我需要的查詢字符串並將其分配給一個變量,但我怎樣才能將其轉換爲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
如果我能弄清楚如何從觸發器內執行預備語句,請參閱我的相關問題:http://stackoverflow.com/q/11514713/1224615 – user1224615 2012-07-17 01:03:29