首頁 >資料庫 >mysql教程 >如何在插入後更新 MySQL 中的現有行而不使用觸發器鎖定?

如何在插入後更新 MySQL 中的現有行而不使用觸發器鎖定?

Patricia Arquette
Patricia Arquette原創
2024-12-13 00:28:09803瀏覽

How to Update an Existing Row in MySQL After an Insert Without Trigger Locking?

插入後更新同一個表中現有行的MySQL 觸發器

問題陳述

何時一個新行被插入到ACCOUNTS 表中,同一個表中對應的現有行的pk相等新插入行的 edit_on 列需要透過將其狀態列設為「E」來更新。但是,在觸發器內嘗試此更新時會發生錯誤,指出該表已被呼叫觸發器的語句使用。

解決方案

由於由於更新已被觸發語句修改的觸發器內的表的限制,需要採用替代方法。

已儲存過程

建立一個預存過程,在單一交易中處理插入和更新作業。涉及的步驟如下:

  1. 將新行插入 ACCOUNTS 表。
  2. 更新 pk 與新插入行的 edit_on 欄位相符的現有行,設定狀態列為「E」。
  3. 提交交易以完成

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn