추천 학습: mysql 비디오 튜토리얼
실제 개발에서 우리는 종종 다음과 같은 상황에 직면합니다. 제품 정보 및 재고 정보와 같은 2개 이상의 상호 연관된 테이블이 2개에 저장됩니다. 서로 다른 데이터 테이블에, 새로운 제품 기록을 추가할 때 데이터의 무결성을 보장하기 위해 재고 테이블에 재고 기록도 추가해야 합니다. 이러한 방식으로, 우리는 이 두 가지 관련 작업 단계를 프로그램에 작성하고 트랜잭션으로 래핑하여 이 두 작업이 모두 실행되거나 모두 실행되지 않는 원자적 작업이 되도록 해야 합니다.
특별한 상황이 발생하는 경우 데이터를 수동으로 유지 관리해야 할 수 있으므로 한 단계를 잊어버리기 쉽고 데이터가 손실될 수 있습니다. 이때 트리거를 사용할 수 있습니다. 제품 정보 데이터를 삽입하면 자동으로 재고 데이터 삽입이 트리거되도록 트리거를 생성할 수 있습니다. 이렇게 하면 인벤토리 데이터를 추가하는 것을 잊어버려서 데이터가 누락되는 것에 대해 걱정할 필요가 없습니다.
MySQL은 버전 5.0.2부터 트리거를 지원합니다. 저장 프로시저와 마찬가지로 MySQL 트리거는 MySQL 서버에 포함된 프로그램입니다. 트리거는 INSERT, UPDATE, DELETE 이벤트를 포함한 이벤트에 의해 트리거되는 작업입니다.
이벤트라는 것은 사용자의 행동이나 특정 행동을 유발하는 것을 말합니다. 트리거 프로그램이 정의되어 있으면 데이터베이스가 이러한 명령문을 실행하면 이벤트가 발생하는 것과 동일하며 자동으로 트리거가 트리거되어 해당 작업을 수행합니다. 데이터 테이블의 데이터에 대해 삽입, 업데이트 및 삭제 작업이 수행되고 일부 데이터베이스 논리가 자동으로 실행되어야 하는 경우 트리거를 사용하여 이를 수행할 수 있습니다.
트리거 구문 생성
CREATE TRIGGER 触发器名称 {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 FOR EACH ROW 触发器执行的语句块;
설명:
테이블 이름: 트리거가 모니터링하는 개체를 나타냅니다.
BEFORE | AFTER: 트리거 시간을 나타냅니다. BEFORE는 이벤트 전의 트리거를 의미하고 AFTER는 이벤트 이후의 트리거를 의미합니다.
INSERT | 업데이트 | 삭제: 트리거된 이벤트를 나타냅니다.
INSERT는 레코드가 삽입될 때 트리거되는 것을 의미합니다.
UPDATE는 레코드가 업데이트될 때 트리거되는 것을 의미합니다.
DELETE는 레코드가 삭제될 때 트리거되는 것을 의미합니다.
두 개의 테이블 생성
CREATE TABLE test_trigge r ( id INT PRIMARY KEY AUTO_INCREMENT , t_note VARCHAR ( 30 ) ) ; CREATE TABLE test_trigger_log ( id INT PRIMARY KEY AUTO_INCREMENT , t_log VARCHAR ( 30 ) ) ;
트리거 생성
DELIMITER / / CREATE TRIGGER befo_re_insert BEFORE INSERT ON test_trigger FOR EACH ROW BEGIN INSERT INTO test_trigger_log ( t_log ) VALUES ( ' befo re_inse rt ' ) ; END / / DELIMITER ;
test_trigger 데이터 테이블에 데이터 삽입
INSERT INTO test_trigger (t_note) VALUES ('测试 BEFORE INSERT 触发器');
test_trigger_log 데이터 테이블의 데이터 보기
SELECT * FROM test_trigger_log
트리거를 생성하세요
DELIMITER / / CREATE TRIGGER after_insert AFTER INSERT ON test_trigger FOR EACH ROW BEGIN INSERT INTO test_trigger_log ( t_log ) VALUES ( ' after_insert ' ) ; END / / DELIMITER ;
test_trigger 데이터 테이블에 데이터를 삽입하세요.
INSERT INTO test_trigger (t_note) VALUES ('测试 AFTER INSERT 触发器');
test_trigger_log 데이터 테이블의 데이터 보기
SELECT * FROM test_trigger_log
직원 테이블 "employees"의 INSERT 이벤트를 기반으로 "salary_check_trigger" 트리거를 정의한 후 INSERT 전에 해당 직원의 급여가 추가할 신규 직원이 리더의 급여보다 큰 경우, sqlstate_value가 'HY000'이라는 오류가 보고되어 추가가 실패하게 됩니다.
DELIMITER // CREATE TRIGGER salary_check_trigger BEFORE INSERT ON employees FOR EACH ROW BEGIN DECLARE mgrsalary DOUBLE; SELECT salary INTO mgrsalary FROM employees WHERE employee_id = NEW.manager_id; IF NEW.salary > mgrsalary THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '薪资高于领导薪资错误'; END IF; END // DELIMITER ;
위 트리거 선언 과정에서 NEW 키워드는 INSERT 문의 새로운 레코드를 의미합니다.
방법 1: 현재 데이터베이스의 모든 트리거 정의 보기
SHOW TRIGGERS
방법 2: 현재 데이터베이스의 트리거 정의 보기
SHOW CREATE TRIGGER 触发器名
방법 3: 시스템 라이브러리의 TRIGGERS 테이블에서 information_schema "salary_check_trigger" 트리거의 정보를 조회합니다.
SELECT * FROM information_schema.TRIGGERS;
트리거 삭제
DROP TRIGGER IF EXISTS 触发器名称
1. 트리거는 데이터 무결성을 보장할 수 있습니다.
구매 주문 헤더 테이블(demo.importhead)을 사용하여 구매 주문 번호, 공급자 번호, 창고 번호, 총 구매 수량, 총 구매 금액 및 수락 날짜를 포함한 구매 주문의 전체 정보를 저장한다고 가정해 보겠습니다.
구매 주문 내역 테이블(demo.importdetails)을 이용하여 구매 주문 번호, 제품 번호, 구매 수량 등 구매한 상품의 세부 정보를 저장하세요
수량, 구매 가격, 구매 금액이 구매 주문 내역의 총 수량 및 총 금액과 일치하지 않습니다.
이 문제를 해결하기 위해 트리거를 사용하여 구매 주문 세부 정보 테이블에 데이터 삽입, 수정 및 삭제가 있을 때마다
2단계 작업이 자동으로 트리거되도록 규정할 수 있습니다.
1) 구매 주문 내역 테이블 구매 주문 테이블의 총 수량 및 총액
2) 첫 번째 단계에서 계산된 값을 사용하여 구매 주문 테이블의 총 수량 및 총액을 업데이트합니다.
이렇게 하면 구매 주문서 테이블의 총 수량과 총액이 항상 구매 주문 세부 테이블에서 계산된 총 수량 및
총액과 동일하며 데이터가 서로 충돌하지 않습니다. 기타. 모순.
2. 트리거는 작업 로그를 기록하는 데 도움이 될 수 있습니다.
트리거를 사용하면 언제 무슨 일이 일어났는지 구체적으로 기록할 수 있습니다. 예를 들어, 회원의 저장 가치 금액을 수정하는 트리거를 기록하는 것은 매우 좋은 예입니다. 이는 작업을 수행할 때 특정 시나리오를 복원하고 문제의 원인을 더 잘 찾는 데 매우 유용합니다.
3. 트리거를 사용하여 데이터를 작동하기 전에 데이터의 유효성을 확인할 수도 있습니다.
예를 들어 슈퍼마켓에서 물건을 구매할 때 창고 관리자가 구매 가격을 입력해야 합니다. 그러나 인간의 조작에서는 실수하기 쉽습니다. 예를 들어 수량을 입력할 때 바코드를 스캔하고 일련번호를 읽으면 입력된 가격이 판매 가격을 훨씬 초과하므로 엄청난 금액이 발생합니다. .....
실제 삽입 또는 업데이트 작업 전에 해당 데이터를 확인하고 적시에 오류를 표시하며
잘못된 데이터가 시스템에 입력되는 것을 방지하기 위해 트리거를 통해 사용할 수 있습니다.
트리거의 단점
1. 트리거의 가장 큰 문제점 중 하나는 가독성이 좋지 않다는 것입니다.
예를 들어 회원 재충전 작업을 수정하는 트리거를 만듭니다. 트리거 동작에 문제가 있는 경우 회원의 저장 가치 금액 업데이트가 실패합니다. 다음 코드를 사용하여
결과를 보면 시스템에서 오류 메시지가 표시되고 "aa" 필드가 존재하지 않는 것으로 나타났습니다.트리거의 데이터 삽입 작업에 추가 필드가 있어 시스템에서 오류 메시지가 표시되기 때문입니다. 하지만 이 트리거를 이해하지 못한다면 업데이트 문 자체에 문제가 있거나, 회원 정보 테이블의 구조에 문제가 있다고 생각할 수도 있습니다. 아마도 이 문제를 해결하기 위해 회원 정보 테이블에 "aa"라는 필드를 추가할 수도 있지만 결과는 허무할 것입니다.
2. 관련 데이터의 변경으로 인해 트리거 오류가 발생할 수 있습니다.
특히 데이터 테이블 구조의 변경으로 인해 트리거 오류가 발생하여 데이터 작업의 정상적인 작동에 영향을 미칠 수 있습니다. 이는 트리거 자체의 은폐로 인해 애플리케이션 오류의 원인을 해결하는 효율성에 영향을 미칩니다.
Notes
자식 테이블에 외래 키 제약 조건이 정의되어 있고 외래 키가 ON UPDATE/DELETE CASCADE/SET NULL 절을 지정하는 경우, 상위 테이블에서 참조하는 키 값을 수정하거나 상위 테이블을 삭제하면 참조된 레코드 행은 하위 테이블에 대한 수정 및 삭제 작업도 발생시킵니다. 이때 하위 테이블의 UPDATE 및 DELETE 문을 기반으로 정의된 트리거는 활성화되지 않습니다.
추천 학습:
mysql 비디오 튜토리얼위 내용은 MySQL은 트리거 사용 방법을 간단한 용어로 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!