> 데이터 베이스 > MySQL 튜토리얼 > 저장 프로시저를 사용하여 MySQL 테이블의 이전 행과 새 행을 업데이트하는 방법은 무엇입니까?

저장 프로시저를 사용하여 MySQL 테이블의 이전 행과 새 행을 업데이트하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-10-29 13:51:29
원래의
350명이 탐색했습니다.

How to Update Previous and New Rows in a MySQL Table Using Stored Procedures?

트리거를 사용하여 MySQL 테이블의 이전 및 새 행 수정

문제:

테이블에서 항목 추적 수수료 , 새 기록의 startDate 하루 전에 종료되도록 동일한 procKey를 사용하여 이전 기록의 endDate를 업데이트하는 동시에 새 수수료 기록을 삽입하려고 합니다.

초기 접근 방식:

다음 코드를 사용하여 트리거를 생성하려고 했습니다.

CREATE
DEFINER=`root`@`%`
TRIGGER `im`.`splitBeforeIns`
BEFORE INSERT ON `im`.`split`
FOR EACH ROW
BEGIN
    SET NEW.tcPercent = (NEW.tcOfficeFee / NEW.globalFee) * 100 , NEW.proPercent = 100 - NEW.tcPercent, NEW.endDate = 20501231;
    UPDATE im.split set endDate = ADDDATE(NEW.startDate, -1) where procKey = NEW.procKey AND endDate = 20501231;
END$$
로그인 후 복사

그러나 이 트리거로 인해 다음 오류가 발생했습니다. "저장된 함수/트리거에서 테이블 '분할'이 이미 존재하기 때문에 업데이트할 수 없습니다. 이 저장된 함수/트리거를 호출한 문에서 사용됩니다."

해결 방법:

트리거는 동일한 테이블의 다른 행을 수정할 수 없습니다.

원하는 기능을 얻으려면 트리거 대신 저장 프로시저를 사용해야 합니다. 저장 프로시저는 수정하려는 테이블에 삽입하거나 업데이트하는 것을 포함하여 단일 트랜잭션의 일부로 여러 작업을 수행할 수 있습니다.

저장 프로시저 예시:

CREATE PROCEDURE updateSplit(IN @procKey INT, IN @startDate DATE, IN @endDate DATE)
BEGIN
    DECLARE @errorMessage VARCHAR(255);
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    START TRANSACTION;
    INSERT INTO split (procKey, startDate, endDate, tcOfficeFee, globalFee) 
    VALUES (@procKey, @startDate, @endDate, @tcOfficeFee, @globalFee);
    
    IF @@ROWCOUNT > 0 THEN
        -- Only update previous record if a new row was successfully inserted
        UPDATE split SET endDate = ADDDATE(@startDate, -1)
        WHERE procKey = @procKey AND endDate = 20501231;
        
        IF @@ROWCOUNT > 0 THEN
            COMMIT;
        ELSE
            SET @errorMessage = 'Failed to update previous record';
            ROLLBACK;
        END IF;
    ELSE
        SET @errorMessage = 'Failed to insert new record';
        ROLLBACK;
    END IF;
END
로그인 후 복사

이 저장 프로시저는 원하는 대로 분할 테이블을 업데이트하는 데 사용할 수 있습니다.

CALL updateSplit(123, '2022-06-01', '2022-06-30');
로그인 후 복사

위 내용은 저장 프로시저를 사용하여 MySQL 테이블의 이전 행과 새 행을 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿