>  기사  >  데이터 베이스  >  MySQL에서 동일한 테이블을 수정하는 트리거 내부의 테이블을 업데이트할 수 없는 이유는 무엇입니까?

MySQL에서 동일한 테이블을 수정하는 트리거 내부의 테이블을 업데이트할 수 없는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-08 22:52:02711검색

Why Can't I Update a Table Inside a Trigger That's Modifying the Same Table in MySQL?

트리거 문제 해결: 테이블 수정과의 비호환성

MySQL에서 트리거는 특정 이벤트를 기반으로 데이터베이스 작업을 자동화하는 데 사용되는 강력한 도구입니다. 그러나 트리거 실행 중에 문제가 발생하면 문제 해결이 중요합니다. 이 문서에서는 MySQL 트리거가 작동하지 않을 때 발생하는 일반적인 오류를 다룹니다.

문제 설명:

사용자가 트리거가 특정 열(PTS)을 업데이트하지 않는다고 보고했습니다. ) pos_table의 해당play_games 열이 변경된 경우. 쿼리가 수동으로 작동했음에도 불구하고 트리거가 업데이트를 트리거하지 못했습니다.

트리거 구조:

CREATE TRIGGER `upd_PTS` AFTER UPDATE ON `pos_table`
FOR EACH ROW BEGIN
    IF (NEW.played_games <> OLD.played_games)
    THEN  
        update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));
    END IF;
END

발생한 오류:

played_games 열을 수동으로 편집하려고 할 때 사용자에게 "이 저장 함수/트리거를 호출한 문에서 이미 사용하고 있기 때문에 저장된 함수/트리거의 테이블 pos_table을 업데이트할 수 없습니다."라는 오류가 표시되었습니다.

해결 방법:

이 문제는 트리거가 트리거 이벤트(played_games 업데이트)에서 참조된 동일한 테이블(pos_table)을 수정하려고 시도했다는 사실에서 발생했습니다. MySQL의 저장 프로그램 제한 사항에 설명된 대로 저장 함수 또는 트리거는 호출 문에서 이미 사용 중인 테이블을 수정할 수 없습니다.

대체 솔루션:

피하려면 이 문제는 대신 BEFORE INSERT 트리거를 사용하는 것이 좋습니다. 이 경우 트리거는 다음과 같이 수정될 수 있습니다.

CREATE TRIGGER `upd_PTS` BEFORE INSERT ON `pos_table`
FOR EACH ROW BEGIN
    SET NEW.PTS = ((NEW.won_games*2)+(NEW.tie_games*1));
END

추가 고려 사항:

발생한 오류 외에도 기사에서는 다음과 같은 문제를 강조합니다. PTS와 같은 계산된 열을 저장합니다. 표시 시 다른 열에서 쉽게 계산할 수 있으므로 별도의 열로 저장하지 않는 것이 더 효율적이고 오류 발생 가능성도 낮을 수 있습니다.

위 내용은 MySQL에서 동일한 테이블을 수정하는 트리거 내부의 테이블을 업데이트할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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