2009-04-01 3 views
0

테이블 T에 새 행을 삽입 할 때 테이블이 특정 임계 값보다 큰지 확인하고 싶다면 대소 문자가 가장 오래된 레코드를 삭제하십시오.MySQL 트리거 : 테이블이 너무 커지면 행을 삭제할 수 있습니까?

나는 단순히 트리거를 만들 수 있다고 생각하지만, 우리가 실제로 삽입되는 분명히 MySQL은 테이블의 수정을 허용하지 않습니다

Delimiter $$ 
CREATE TRIGGER test 
     AFTER INSERT ON amoreAgentTST01 
     FOR EACH ROW 
BEGIN 
    DECLARE table_size INTEGER; 
    DECLARE new_row_size INTEGER; 
    DECLARE threshold INTEGER; 
    DECLARE max_update_time TIMESTAMP; 

SELECT SUM(OCTET_LENGTH(data)) INTO table_size FROM amoreAgentTST01; 
SELECT OCTET_LENGTH(NEW.data) INTO new_row_size; 
SELECT 500000 INTO threshold; 
select max(updatetime) INTO max_update_time from amoreAgentTST01; 

IF (table_size+new_row_size) > threshold THEN 
    DELETE FROM amoreAgentTST01 WHERE max_update_time = updatetime; -- and check if not current 
END IF; 
END$$ 
delimiter ; 
: 여기
Code: 1442 Msg: Can't update table 'amoreAgentTST01' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

내가 시도 트리거입니다

데이터베이스에서이 작업을 수행하는 방법에 대해 알고 있습니까?

분명히 내 프로그램에서해야 할 일이 있습니까?

답변

4

사용량이 적은 시간에 실행되는 별도의 프로세스에서 전용 보관 전략을 사용하는 것이 가장 이상적입니다.

응용 프로그램 서버 내에 예약 된 저장 프로 시저 (yuck) 또는 추가 배경 작업자 스레드 또는 완전히 별개의 응용 프로그램 서비스로 구현할 수 있습니다. 이것은 다른 정기적 인 관리 작업을 수행하기에 좋은 장소입니다.

몇 가지 이점이 있습니다. 트리거 문제를 피하는 것 외에도 의 성능 영향을 고려해야합니다. 트리거에서 발생합니다. 많은 삽입 작업을 수행하면 해당 프로세스가 동일한 테이블에 액세스하려고 할 때 발생하는 잠금 경합은 말할 것도없고 해당 트리거는 작업의 절반 정도를 수행합니다.

하우스 키핑 작업을 수행하는 별도의 프로세스는 잠금 경합을 최소화하고 작업을 트랜잭션에서 고성능 대량 작업으로 수행 할 수있게합니다.

마지막으로 한 가지 - 레코드를 삭제하는 대신 레코드를 다른 테이블이나 데이터베이스에 보관하는 것이 좋습니다.

관련 문제