MySQL 트리거의 정확한 사용과 사례 분석

22303 단어
아래의 글은 주로 여러분께 트리거의 실제 사용에 대한 상세한 설명과 실제 사례 분석을 말씀드리는 동시에 본고는 MySQL 트리거의 실제 조작에서 코드를 열거했습니다. 다음은 글의 상세한 내용을 소개하는 것이니 참고하시기 바랍니다.
트리거 사례
 

  
  
  
  
  1. mysql> select * from a; +------+------+------+ 
    | id | name | age | +------+------+------+ 
    | 1 | A1 | 10 | | 2 | A2 | 20 | +------+------+------+ 
    mysql
    > select * from b; +------+------+------+ 
    | rid | id | age | +------+------+------+ | 5 | 2 | 20 | +------+------+------+  

표 a의age 필드가 업데이트될 때 b에 해당하는age 필드도 업데이트할 수 있기를 바랍니다.
 
예:
 
 

  
  
  
  
  1. update a set ageage=age+1 where id=2;  

 
관련 테이블은 다음과 같습니다.
 

  
  
  
  
  1. mysql> select * from a; +------+------+------+ 
    | id | name | age | +------+------+------+ 
    | 1 | A1 | 10 | | 2 | A2 | 21 | +------+------+------+ 
    mysql
    > select * from b; +------+------+------+ 
    | rid | id | age | +------+------+------+ | 5 | 2 | 21 | +------+------+------+ 

정확한 서법
트리거 코드
 

  
  
  
  
  1. CREATE TRIGGER bbs1 AFTER UPDATE ON a FOR EACH ROW update b set age=NEW.age where id=NEW.id;  

MySQL 트리거
 
트리거의 개념: "데이터베이스에서 특수한 표의 일부 이벤트에 응답하기 위해 자동으로 실행되는 프로그램 코드."(Wikipedia) 간단하게 말하자면 INSERT나 DELETE와 같은 특수한 데이터베이스 이벤트가 발생할 때 자동으로 활성화되는 코드입니다.트리거는 로깅, 개별 테이블에서 다른 링크 테이블로의 자동 계단식 변경 또는 테이블 관계의 자동 업데이트를 위해 쉽게 사용할 수 있습니다.
새로운 정수치가 데이터베이스 영역에 증가할 때, 자동으로 업데이트되는 전체 수량의 코드 세그먼트는 트리거입니다.특수 데이터베이스 테이블에서 변경된 SQL 명령 블록을 자동으로 기록하는 것도 트리거의 예입니다.
트리거는 MySQL 5.x의 새로운 기능,x 코드 트리의 새로운 버전이 등장하면서 이 기능도 점차 개선되었다.본고에서 트리거를 어떻게 정의하고 사용하는지, 트리거의 상태를 확인하고 트리거를 사용한 후에 삭제하는지 간단하게 소개하겠습니다.나는 또한 트리거가 현실 세계에서 응용된 실례를 보여주고 데이터베이스 기록에 대한 변화를 검증할 것이다.
 
예.
 
간단한 실례를 통해 설명하는 것이 MySQL 트리거의 응용을 이해하는 가장 좋은 방법이다.우선 두 개의 단일 영역의 표를 만듭니다.한 표는 이름 목록 (표 이름: 데이터) 이고, 다른 표는 삽입된 문자의 문자 수 (표 이름:chars) 이다.데이터 테이블에 트리거를 정의하고 새 이름을 삽입할 때마다chars표에서 실행되는 총 수량은 새로 삽입된 기록의 문자 수에 따라 자동으로 업데이트됩니다.
 
 
 

  
  
  
  
  1. mysql> CREATE TABLE data (name VARCHAR(255)); 
    Query OK, 0 rows affected (0.09 sec) mysql
    > CREATE TABLE chars (count INT(10)); 
    Query OK, 0 rows affected (0.07 sec) mysql
    > INSERT INTO chars (count) VALUES (0); 
    Query OK, 1 row affected (0.00 sec) mysql
    > CREATE TRIGGER t1 
    AFTER INSERT ON data FOR EACH ROW UPDATE chars SET 
    countcount = count + CHAR_LENGTH(NEW.name); Query OK, 0 rows affected (0.01 sec)  

     

 
위 코드를 이해하는 열쇠는 새 트리거를 정의하는 데 사용되는 CREATE TRIGGER 명령입니다.이 명령은 데이터 테이블에 새 기록이 삽입될 때마다 t1이 활성화되는 새 트리거를 만듭니다.
 
이 트리거에는 두 개의 중요한 자구가 있다.
 
AFTER INSERT 자문은 트리거가 새 레코드에 데이터 테이블을 삽입한 후 활성화되었음을 나타냅니다.
 
UPDATE chars SET count = count + CHAR_LENGTH(NEW.name) 자문은 트리거가 활성화된 후 수행되는 SQL 명령을 나타냅니다.이 예에서, 이 명령은 새로 삽입된 데이터를 표시합니다.name 필드의 문자 수로 chars를 업데이트합니다.count 표시줄.이 정보는 내장된 MySQL 함수 CHARLENGTH()가 획득되었습니다.
 
소스 테이블 도메인 이름 앞에 놓인 NEW 키워드도 주목할 필요가 있습니다.이 키워드는 트리거가 필드의 new 값을 고려해야 한다는 것을 보여 줍니다. (즉, 필드에 방금 삽입된 값입니다.)MySQL은 도메인의 이전 값을 가리키는 적절한 OLD 접두사도 지원합니다.
 
SHOW TRIGGER 명령을 호출하여 트리거가 활성화되었는지 확인할 수 있습니다.
 
 
 

  
  
  
  
  1. mysql> SHOW TRIGGERS; *************************** 
    1. row *************************** 
    ?Trigger: t1 ?Event: INSERT ?Table: data Statement: 
    UPDATE chars SET 
    countcount = count + CHAR_LENGTH(NEW.name) 
    Timing: AFTER ?Created: NULL ql_mode: 1 row in set (0.01 sec)  

 
트리거를 활성화한 후 테스트를 시작합니다.데이터 테이블에 몇 개의 레코드를 삽입해 보십시오.
 
 
 

  
  
  
  
  1. mysql> INSERT INTO data (name) VALUES ('Sue'), ('Jane'); 
    Query OK, 2 rows affected (0.00 sec) Records: 2?Duplicates: 0?Warnings: 0 

 
그런 다음 chars 테이블에서 MySQL 트리거가 완료한 작업을 완료했는지 확인합니다.
 
 

  
  
  
  
  1. mysql> SELECT * FROM chars; +-------+ 
    | count | +-------+ | 7| +-------+ 1 row in set (0.00 sec) 

 
보시다시피 데이터 테이블의 INSERT 명령은 트리거를 활성화합니다. 트리거는 기록된 문자 수를 계산하고chars 테이블에 결과를 저장합니다.데이터 테이블에 다른 기록을 추가하면chars.count치도 상응하여 증가합니다.
트리거가 적용되면 DROP TRIGGER 명령을 사용하여 쉽게 삭제할 수 있습니다.
 
 
 

  
  
  
  
  1. mysql> DROP TRIGGER t1; Query OK, 0 rows affected (0.00 sec) 

 
주의: 이상적인 경우, 원본 표에서 기록이 삭제될 때마다 문자 총수에서 기록된 문자 수를 줄이는 역전 트리거가 필요합니다.이것은 쉽게 할 수 있으니 너는 그것을 연습으로 삼아 완성할 수 있다.팁: BEFORE DELETE ON 자문을 적용하는 방법이 있습니다.
자체 쓰기(테스트됨)
 
 

  
  
  
  
  1. mysql> create trigger t2 before delete on 
    data for each row update chars set 
    countcount=count-char_length(old.name); 
    Query OK, 0 rows affected (0.03 sec) 

 
현재, 나는 이 표에 대한 변화를 추적하기 위해 감사 기록을 세우고 싶다.이 기록은 표의 모든 변경 사항을 반영하고 사용자에게 누가 변경했는지, 그리고 변경된 시간을 설명할 것이다.이 정보 (표 이름:audit) 를 저장하기 위해 새 표를 만들어야 합니다. 아래와 같습니다.(목록 C)
목록 C
 
 
 

  
  
  
  
  1. mysql> CREATE TABLE audit (id INT(7), balance FLOAT, 
    user VARCHAR(50) NOT NULL, time TIMESTAMP NOT NULL); 
    Query OK, 0 rows affected (0.09 sec) 
    mysql
    > create table accounts(id int(7),label VARCHAR(45),balance float); 

 
다음에, 나는 accounts 표에 MySQL 트리거를 정의할 것이다.(목록 D)
목록 D
 
 
 

  
  
  
  
  1. mysql> CREATE TRIGGER t3 AFTER UPDATE ON accounts 
    FOR EACH ROW INSERT INTO audit (id, balance, user, time) 
    VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW()); 
    Query OK, 0 rows affected (0.04 sec) 

 
만약 네가 이미 여기까지 왔다면 이해하기 쉽다.accounts표는 UPDATE를 한 번 겪을 때마다 트리거 삽입(INSERT)에 대응하는 id, 새로운 잔액, 현재 시간과 로그인audit표에 대응하는 사용자의 이름을 삽입합니다.
실현 중인 예: 트리거로 감사 기록
촉발기의 기본 원리를 이해했으니 좀 복잡한 예를 살펴보자.우리는 데이터베이스에 대한 각종 사용자의 변경 사항을 기록하기 위해 트리거를 자주 사용합니다.회계감사 기록의 실제 응용을 이해하기 위해 아래의 표(표명:accounts)를 보십시오. 이것은 한 사용자의 세 개의 은행 계좌 잔액을 열거합니다.(표 A)
 
표 A
 
 
 

  
  
  
  
  1. mysql> SELECT * FROM accounts; +----+------------+---------+ 
    | id | label| balance | +----+------------+---------+ 
    |1 | Savings #1 |500 | |2 | Current #1 |2000 | |3 | 
    Current #2 |3500 | +----+------------+---------+ 3 rows in set (0.00 sec) 

 
그런 다음 트리거가 활성화되었는지 확인합니다.
 
 

  
  
  
  
  1. mysql> SHOW TRIGGERS ; *************************** 
    1. row *************************** ?Trigger: t1 ?Event: 
    UPDATE ?Table: accounts Statement: INSERT INTO audit (id, balance, user, time) 
    VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW()) Timing: AFTER ?Created: NULL Sql_mode: 1 row in set (0.01 sec) 

 
마지막 결과 보기 (목록 E):
목록 E
 
 
 

  
  
  
  
  1. mysql> UPDATE accounts SET balance = 500 WHERE id = 
    1; Query OK, 1 row affected (0.00 sec) Rows matched: 
    1?Changed: 1?Warnings: 0 mysql
    > UPDATE accounts SET 
    balance = 900 WHERE id = 3; Query OK, 1 row affected 
    (0.01 sec) Rows matched: 1?Changed: 1?Warnings: 0 mysql
    > 
    UPDATE accounts SET 
    balance = 1900 WHERE id = 1; Query OK, 
    1 row affected (0.00 sec) Rows matched: 1?Changed: 1?Warnings: 0  

 
accounts표에 대한 변경 사항은audit표에 기록되어 있으며, 장래에 문제가 발생하면 쉽게 복구할 수 있습니다.
 
 

  
  
  
  
  1. mysql> SELECT * FROM audit; +------+---------+----------------+---------------------+ 
    | id| balance | user| time| +------+---------+----------------+---------------------+ 
    |1 |500 | root@localhost | 2006-04-22 12:52:15 | |3 |900 | root@localhost | 2006-04-22 12:53:15 
    | |1 |1900 | root@localhost | 2006-04-22 12:53:23 | +------+---------+----------------+---------------------+ 3 rows in set (0.00 sec)  

 
위의 예에서 보듯이 MySQL 트리거는 강력한 새로운 기능으로 RDBMS의 자동화 수준을 크게 향상시켰다.스스로 가서 시험하고 연습해라!

좋은 웹페이지 즐겨찾기