>데이터 베이스 >MySQL 튜토리얼 >MySQL 트리거로 인한 테이블 업데이트 오류를 ​​해결하는 방법은 무엇입니까?

MySQL 트리거로 인한 테이블 업데이트 오류를 ​​해결하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-26 22:44:13219검색

How to Resolve the MySQL Trigger-Induced Table Update Error?

트리거로 인한 테이블 업데이트 딜레마

업데이트 후 자체 트리거 내에서 동일한 테이블을 업데이트하려고 할 때 일반적인 문제가 발생합니다. 이는 동일한 행 내의 다른 열에 대한 변경 사항을 기반으로 테이블의 특정 열을 수정하도록 트리거가 설계되었을 때 더욱 분명해집니다.

예: 열 합계 계산

다음 시나리오를 고려해보세요. 점수가 나올 때마다 "products_score" 테이블의 "votes_total" 열을 업데이트하려고 합니다. 수정됨:

CREATE TRIGGER upd_total_votes AFTER UPDATE ON products_score
FOR EACH ROW
UPDATE
    products_score
SET
    products_score.votes_total =
        (SELECT
             (votes_1 + votes_2 + votes_3 + votes_4 + votes_5)
         FROM
             products_score
         WHERE
             id = new.id)

그러나 테이블에서 업데이트를 실행하면 오류가 발생합니다.

#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

이 오류는 트리거 논리의 순환 참조로 인해 발생합니다. 업데이트 문은 트리거가 새 총계를 계산하기 위해 사용하는 "votes_total" 열을 수정하려고 시도합니다.

딜레마 해결

이 문제를 피하려면 트리거를 다음과 같이 수정할 수 있습니다. 업데이트 이후 대신 업데이트 이전에 실행:

CREATE TRIGGER upd_total_votes BEFORE UPDATE ON products_score
FOR EACH ROW
BEGIN
    SET new.votes_total = new.votes_1 + new.votes_2 + new.votes_3 + new.votes_4 + new.votes_5
END
;

이 수정된 트리거에서는 새로운 "votes_total" 값을 계산하고 할당합니다. 실제 업데이트가 발생하기 전에 "새" 행 개체에 추가합니다. 이를 통해 순환 참조 문제 없이 업데이트 문을 진행할 수 있습니다.

위 내용은 MySQL 트리거로 인한 테이블 업데이트 오류를 ​​해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.