>데이터 베이스 >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으로 문의하세요.