插入後更新同一個表中現有行的MySQL 觸發器
問題陳述
何時一個新行被插入到ACCOUNTS 表中,同一個表中對應的現有行的pk相等新插入行的 edit_on 列需要透過將其狀態列設為「E」來更新。但是,在觸發器內嘗試此更新時會發生錯誤,指出該表已被呼叫觸發器的語句使用。
解決方案
由於由於更新已被觸發語句修改的觸發器內的表的限制,需要採用替代方法。
已儲存過程
建立一個預存過程,在單一交易中處理插入和更新作業。涉及的步驟如下:
SQL 語法
CREATE PROCEDURE setEditStatus(IN NEW_pk INT, IN NEW_edit_on INT) BEGIN /* Insert new row into ACCOUNTS table */ INSERT INTO ACCOUNTS (pk, user_id, edit_on, status) VALUES (NEW_pk, /* User ID */, NEW_edit_on, 'A'); /* Update existing row */ UPDATE ACCOUNTS SET status = 'E' WHERE pk = NEW_edit_on; /* Commit changes */ COMMIT; END;
觸發器
修改觸發器以呼叫預存程序直接嘗試更新。
DELIMITER $$ DROP TRIGGER IF EXISTS `setEditStatus`$$ CREATE TRIGGER `setEditStatus` AFTER INSERT on ACCOUNTS FOR EACH ROW BEGIN CALL setEditStatus(NEW.pk, NEW.edit_on); END$$ DELIMITER ;
此解決方法允許希望在不違反觸發器內更新相同表的限制的情況下執行更新。
以上是如何在插入後更新 MySQL 中的現有行而不使用觸發器鎖定?的詳細內容。更多資訊請關注PHP中文網其他相關文章!