문제:
테이블에서 항목 추적 수수료 , 새 기록의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!