MySQL 트리거 사용

2958 단어 MySQL트리거
트리거는 실행 문 앞이나 실행 후에 다른 SQL 코드를 터치하여 실행할 수 있습니다.트리거는 트리거 문장이 어떤 데이터를 바꿨는지 읽을 수 있지만 되돌아오는 값이 없습니다.따라서 트리거를 사용하여 업무 논리의 제약을 강화할 수 있고 응용 프로그램에 대응하는 코드를 쓸 필요가 없다.
상기 설명에서 볼 수 있듯이 트리거는 응용 프로그램의 논리를 간소화하고 성능을 향상시킬 수 있다. 이것은 트리거를 사용하여 응용 프로그램과 서비스 측의 상호작용 횟수를 줄였기 때문이다.또한 트리거는 자동 업데이트 귀일화와 통계 데이터를 완성하는 데 도움이 된다.예를 들어 우리는 트리거를 사용하여 거래 주문서의 총 금액, 주문서 수와 평균 객단가를 자동으로 통계할 수 있다.그러나 MySQL의 트리거는 응용 장소도 매우 제한되어 있다. 만약에 다른 데이터베이스 제품의 트리거를 사용한 적이 있다면 MySQL도 같은 기능을 실현할 수 있다고 생각하지 마라. 예를 들어
  • 모든 데이터 테이블의 단일 이벤트에는 트리거가 하나만 있을 수 있습니다. 즉, After INSERT와 같은 이벤트에는 트리거가 한 개 이상 동시에 있을 수 없습니다
  • MySQL은 행 레벨의 트리거만 지원합니다. 즉, FOR EACH ROW와 같은 방식으로만 트리거를 사용할 수 있고 전체 SQL 문장이 아닌 트리거를 사용할 수 있습니다. 이것은 대량의 데이터 조작에 있어 비교적 효과가 없습니다.MySQL 트리거는 다음과 같은 형식으로만 작성할 수 있습니다
  • 
    CREATE TRIGGER   BEFORE|AFTER  
    ON   FOR EACH ROW
    BEGIN
         ;
    END
    
    실행 문장 목록은 하나 이상의 문장을 지원하며, 다음은 여러 문장의 예입니다.
    
    DELIMITER $$
    CREATE TRIGGER user_create_log AFTER INSERT ON t_users FOR EACH ROW
    BEGIN
    DECLARE log_info VARCHAR(40)character set utf8;
    DECLARE description VARCHAR(20) character set utf8;# , 
    SET description = " is created";
    SET log_info = CONCAT(NEW.user_name, description);     # CONCAT 
    INSERT INTO logs(log) values(log_info);
    END $$
    
    DELIMITER ;
    
  • 트리거는 서비스 측이 실제로 실행하는 작업을 예측할 수 없게 할 수 있고 간단한 문장 하나로 인해 서비스 측이 대량의 보이지 않는 작업을 할 수 있다.예를 들어 트리거가 관련 테이블을 업데이트하면 영향을 받는 줄 수가 두 배로 늘어날 수 있습니다
  • 트리거는 디버깅하기 어렵고 트리거를 도입하면 성능 병목을 분석하기 어렵습니다
  • 트리거는 잠재적인 자물쇠 대기와 잠금을 초래할 수 있다.트리거가 실패하면 원본 조회도 실패합니다.트리거의 존재를 깨닫지 못하면 이런 놀이는 발견하기 어렵다.
  • 대부분의 제한 사항 중 가장 큰 제한은 FOR EACH ROW의 디자인입니다. 이로 인해 트리거가 통계와 캐시 테이블을 유지하는 데 사용할 수 없을 때가 있습니다. 이것은 매우 느릴 수 있기 때문입니다.트리거를 사용하는 주요 이유는 정시 동기화 업데이트보다 트리거가 데이터의 일치성을 일치하게 유지할 수 있기 때문이다.트리거도 원자성을 보장할 수 없다.예를 들어, MyISAM 데이터 테이블을 업데이트하는 트리거는 소스 SQL 문장에서 오류가 발생하면 롤백할 수 없습니다.그리고 트리거 자체가 모두 틀릴 수도 있다.만약 우리가 After UPDATE를 사용하여 MyISAM 데이터 테이블을 기반으로 다른 테이블을 업데이트한다면만약 트리거가 두 번째 시계의 조작을 실패하게 하는 오류가 있다면, 첫 번째 시계의 조작은 굴러가지 않을 것이다.
    InnoDB의 트리거와 관련된 조작은 원문을 포함하여 모두 같은 사무에 있기 때문에 원자성을 만족시킨다.그러나 InnoDB의 트리거를 사용하여 다른 테이블과 데이터의 일치성을 검사할 때, 이때 조심하지 않으면 부정확한 결과를 초래할 수 있다.예를 들어 트리거를 사용하여 외부 키를 시뮬레이션해야 한다고 가정하면 BEFORE INSERT 트리거를 사용하여 다른 테이블에 해당하는 기록이 있는지 확인할 수 있지만, 트리거가 다른 테이블 데이터를 읽을 때 SELECT FOR UPDATE를 사용하지 않으면 병발성 문제로 인해 오류가 발생할 수 있습니다.트리거에 결함이 있지만 사용할 수 없다는 뜻은 아니다.반대로 트리거 자체도 유용하다. 특히 제약, 시스템 유지 보수 임무와 통계 데이터를 최신 상태로 유지하는 데 유용하다.
    트리거를 사용하여 데이터 줄의 변화를 기록할 수도 있다.이렇게 하면 오프라인 수동 조작 데이터베이스 기록 (예를 들어 오류 데이터 복구) 도 기록될 수 있다.그러나 주의해야 할 것은 다른 셀프 키 테이블에 데이터를 삽입할 때 조심해야 한다는 것이다. 이것은 복제적인 문장 표현에 문제가 있을 수 있다. 왜냐하면 셀프 부가가치는 두 개의 같은 부본 값에 대해 다르기 때문이다.
    맺음말:
    트리거는 유한한 장소에서 통계 데이터, 데이터 테이블 변경 로그 등 장점을 발휘할 수 있다.그러나 빅데이터 양의 업데이트는 한 줄씩 촉발되기 때문에 효율을 떨어뜨리는 결함도 있다.그리고 MyISAM 엔진은 원자성을 보장할 수 없습니다.따라서 응용 장면에 트리거가 있는지 여부에 따라 해야 한다.
    이상은 MySQL 트리거의 사용에 대한 상세한 내용입니다. MySQL 트리거에 대한 더 많은 자료는 저희 기타 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기