source

트리거 if-delete-clause를 생성할 수 없습니다.

lovecheck 2023. 6. 6. 08:27
반응형

트리거 if-delete-clause를 생성할 수 없습니다.

여기 제가 가지고 있는 코드가 있습니다.

CREATE TRIGGER free_tokens AFTER INSERT ON `csrf_token`
IF (SELECT COUNT(`csrf_token`.`id`)) > 5000 THEN
    DELETE FROM `csrf_token` WHERE `csrf_token`.`time` < (UNIX_TIMESTAMP(NOW() - INTERVAL 2 HOUR))
END IF;

삽입 후 5000개 이상의 항목이 있는지 확인한 다음 2시간이 지난 모든 항목을 삭제합니다.

나는 받는 중입니다.you have an error in your mysql syntax near IF (SELECT ... DELETE FROM ...

제가 MariaDB를 사용하고 있는데, 이 간단한 설명의 오류가 어디에 있는지 누가 이해를 도와주실 수 있나요?

트리거 정의에 누락된 작은 부분이 있습니다.

  • 트리거 명령을 대신 세미콜론으로 구분할 수 있도록 MariaDB 구분 기호 유형을 '//'로 변경합니다.
  • FOR EACH ROWMariaDB 트리거 구문의 일부로
  • 당신의.DELETE문 끝에 세미콜론이 없습니다.
  • IF-THEN-ELSE 문 내부에 쿼리를 중첩할 수 없습니다.
  • ENDMariaDB 구문의 일부로 정의 후 트리거의 끝을 구분합니다.

의 중첩된 쿼리에 대한 해결 방법IF문장은 다음의 결과로 업데이트될 변수를 정의할 수 있습니다.SELECT회의 전에 수행될 예정입니다.IF진술.

DELIMITER //

CREATE OR REPLACE TRIGGER free_tokens 
AFTER INSERT 
    ON `csrf_token` 
FOR EACH ROW
BEGIN
    DECLARE num_rows INT;
    SELECT 
        COUNT(*) INTO num_rows 
    FROM 
        `csrf_token`;
        
    IF num_rows > 5000 THEN 
        DELETE FROM 
            `csrf_token` 
        WHERE 
            `csrf_token`.`time` < (UNIX_TIMESTAMP(NOW() - INTERVAL 2 HOUR));
    END IF;
END//

DELIMITER ;

MariaDB 트리거 구문에 대한 자세한 내용은 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/71832821/cannot-create-trigger-if-delete-clause

반응형