5
模式和數據測試數據庫 - https://gist.github.com/koceg/435c0d2b1246a69d048f當列名是動態的時,如何從觸發器更新表?
我的目標是當有人插入在objects_properties新行表更新板表。要更新的列的名稱是動態的 - 它取決於property_id從objects_properties。
到目前爲止,我已經創建了一個觸發器和存儲過程,但我得到這個錯誤:
Dynamic sql is not allowed in stored function or trigger.
難道我做錯了什麼,或者MySQL的不允許調用存儲過程用一備觸發器內的語句?如果是這樣,我該怎麼做我想要的?
我有一個主意,但即使在僞代碼中也很難看。真正的SQL會更糟糕,因爲會有幾十個代碼:
SWITCH (property_code)
CASE 'name'
INSERT INTO boards (id, name) VALUES (@object_id, @value) ON DUPLICATE KEY UPDATE name = @value;
CASE 'address'
INSERT INTO boards (id, address) VALUES (@object_id, @value) ON DUPLICATE KEY UPDATE address = @value;
CASE 'district'
INSERT INTO boards (id, district) VALUES (@object_id, @value) ON DUPLICATE KEY UPDATE district = @value;
P.S.我無法將這個邏輯移動到我的應用程序中,因爲這個數據庫被多個應用程序使用。
這是一個設計不好的架構,但我無能爲力...... – 2014-12-19 09:08:20
根據MySQL文檔:[D.1限制存儲的程序](http://dev.mysql.com/doc/refman /5.6/en/stored-program-restrictions.html):「SQL準備語句([PREPARE](http://dev.mysql.com/doc/refman/5.6/en/prepare.html),[EXECUTE]( http://dev.mysql.com/doc/refman/5.6/en/execute.html),[DEALLOCATE PREPARE](http://dev.mysql.com/doc/refman/5.6/en/deallocate-prepare。 html))可以用於存儲過程,但不能用於存儲函數或觸發器,因此,存儲函數和觸發器不能使用動態SQL(將語句構造爲字符串並執行它們)。 – wchiquito 2014-12-19 10:19:26
一些選項:不要使用觸發器來使用Prepared Statements,或使用觸發器而不使用Prepared Statements。 – wchiquito 2014-12-19 10:25:44