> 데이터 베이스 > MySQL 튜토리얼 > mysql 트리거에 대한 자세한 설명

mysql 트리거에 대한 자세한 설명

小云云
풀어 주다: 2017-11-22 10:53:52
원래의
2086명이 탐색했습니다.

트리거란 무엇입니까?

트리거는 데이터 무결성을 보장하기 위해 SQL Server에서 프로그래머와 데이터 분석가에게 제공하는 방법입니다. 실행이 아닌 프로그램에 의해 호출됩니다. 수동으로 시작되지 않고 이벤트에 의해 트리거됩니다. 예를 들어 테이블이 조작(삽입, 삭제, 업데이트)되면 해당 실행이 활성화됩니다. 트리거는 데이터 무결성 제약 조건과 비즈니스 규칙을 적용하는 데 자주 사용됩니다. 트리거는 DBA_TRIGGERS 및 USER_TRIGGERS 데이터 사전에서 찾을 수 있습니다. SQL3 트리거는 데이터베이스를 수정하기 위해 시스템에서 자동으로 실행할 수 있는 명령문입니다.

트리거 구문:

CREATE TRIGGER <트리거 이름> --트리거에는 최대 64자의 이름이 있어야 하며 뒤에 구분 기호가 올 수 있습니다. 이는 기본적으로 MySQL의 다른 개체 이름 지정 방법과 유사합니다.
{ BEFORE | AFTER } --트리거에는 실행 시간 설정이 있습니다. 이벤트 발생 전후에 설정할 수 있습니다.
{ INSERT | UPDATE | DELETE } - 트리거된 이벤트를 설정할 수도 있습니다. 삽입, 업데이트 또는 삭제 실행 중에 트리거될 수 있습니다.
ON <테이블 이름> --트리거가 특정 테이블에 속해 있습니다. 이 테이블에 대해 삽입, 업데이트 또는 삭제 작업이 수행되면 트리거가 활성화됩니다. 동일한 테이블에 동일한 이벤트를 할당할 수 없습니다. .
FOR EACH ROW --트리거 실행 간격: FOR EACH ROW 절은 전체 테이블에 대해 한 번이 아니라 행마다 작업을 수행하도록 트리거에 알립니다.
--트리거에는 트리거될 SQL 문이 포함됩니다. 여기에 있는 문은 복합 문을 포함한 모든 법적 문일 수 있지만 여기에 있는 문에는 함수와 동일한 제한이 적용됩니다.

테이블에는 하나의 트리거만 생성할 수 있습니다.

트리거: 특정 상황을 모니터링하고 특정 작업을 트리거합니다.

트리거 생성 구문의 4가지 요소: 1. 모니터링 위치(테이블) 2. 모니터링 이벤트(삽입/업데이트/삭제) 3. 트리거 시간(이후/이전) 4. 트리거 이벤트(삽입/업데이트/삭제)

문법 :

create trigger triggerName
after/before insert/update/delete on 表名
for each row   #这句话在mysql是固定的
begin
로그인 후 복사

sql 문;

end;

참고: 각 색상은 위의 네 가지 요소에 해당합니다.

먼저 두 개의 테이블을 만듭니다.

#商品表
create table g
(
  id int primary key auto_increment,
  name varchar(20),
  num int
);
#订单表
create table o
(
  oid int primary key auto_increment,
   gid int,
     much int
);
insert into g(name,num) values(&#39;商品1&#39;,10),(&#39;商品2&#39;,10),(&#39;商品3&#39;,10);
로그인 후 복사

트리거를 사용하지 않는 경우: 지금 3개의 항목을 판매한다고 가정하면 1, 두 가지 작업을 수행해야 합니다

1. 주문 테이블에 레코드를 삽입합니다

insert into o(gid,much) values(1,3);
로그인 후 복사

2. 제품 테이블에 있는 제품 1의 남은 수량

update g set num=num-3 where id=1;
로그인 후 복사

이제 트리거를 만들어 보겠습니다.

먼저 명령문을 실행해야 합니다: 구분 기호 $(mysql 명령문이 $로 끝나도록 지시한다는 의미)

create trigger tg1
after insert on o
for each row 
begin
update g set num=num-3 where id=1;
end$
로그인 후 복사

이때 ,

insert into o(gid,much) values(1,3)$
로그인 후 복사

만 실행하면 제품 1의 수량이 7로 변경된 것을 확인할 수 있습니다. 즉, 주문을 삽입하면 트리거가 자동으로 업데이트 작업을 수행합니다.

하지만 이제 문제가 생겼습니다. 트리거의 num과 id가 하드코딩되어 있어서 어떤 제품을 구매하든 결국 1번 제품의 수량이 업데이트됩니다. 예를 들어 주문 테이블에 또 다른 레코드를 삽입합니다. o(gid,much) 값(2,3)에 삽입하면 제품 1의 수량이 4로 변경되었지만 제품 2의 수량이 변경되었음을 알 수 있습니다. 이는 분명히 우리가 원하는 결과가 아닙니다. 앞서 만든 트리거를 변경해야 합니다.

트리거에서 행 값을 참조하는 방법, 즉 새로 삽입된 주문 레코드에서 gid 또는 much 값을 가져와야 합니다.

삽입의 경우 새로 삽입된 행은 new로 표시되고 행의 각 열 값은 new.column 이름으로 표시됩니다.

이제 트리거를 이렇게 변경할 수 있습니다

create trigger tg2
after insert on o
for each row 
begin
update g set num=num-new.much where id=new.gid;(注意此处和第一个触发器的不同)
end$
로그인 후 복사

두 번째 트리거가 생성되었으니 먼저 첫 번째 트리거를 삭제하겠습니다

드롭 트리거 tg1$

다시 테스트하고 주문 기록을 삽입해 보겠습니다. o(gid, much)values(2,3)$

실행 후, 제품 2의 수량이 7로 변경된 것으로 확인되었으며, 이는 현재 정확합니다.

다음 두 가지 상황이 있습니다.

1. 사용자가 주문을 취소하고 당사에서 직접 주문을 삭제한 경우 해당 상품 수량을 다시 추가해야 하나요?

2. 사용자가 주문 수량을 수정하는 경우 트리거 수정은 어떻게 작성하나요?

첫 번째 상황을 먼저 분석해 보겠습니다.

모니터링 위치: o 테이블

모니터링 이벤트: 삭제

트리거 시간: 이후

트리거 이벤트: update

삭제 대상: 원래 삭제된 행이 있었습니다. 삭제된 행을 참조하려면 old를 사용하여 삭제된 값을 참조할 수 있습니다. 열.

그런 다음 트리거는 다음과 같이 작성되어야 합니다.

create trigger tg3
after delete on o
for each row
begin
update g set num = num + old.much where id = old.gid;(注意这边的变化)
end$
로그인 후 복사

Created.

delete from o where oid = 2$

2번 제품의 수량이 다시 10개가 되는 것을 확인할 수 있습니다.

두 번째 사례:

모니터링 위치: o 테이블

모니터링 이벤트: update

트리거 시간: after

트리거 이벤트: update

업데이트의 경우: 수정된 행, 수정 전 데이터, 이전 사용은 이전으로 표시됩니다. 컬럼 이름은 수정 전 행의 값을 참조합니다.

수정된 데이터는 new로 표시되며, 컬럼 이름은 수정 후 행의 값을 참조합니다.

그런 다음 트리거를 다음과 같이 작성해야 합니다.

create trigger tg4
after update on o
for each row
begin
update g set num = num+old.much-new.much where id = old/new.gid;
end$
로그인 후 복사

먼저 이전 수량을 복원한 다음 새 수량을 빼서 수정된 수량을 얻습니다.

테스트해 보겠습니다. 먼저 쉽게 테스트할 수 있도록 제품 테이블과 주문 테이블의 데이터를 지웁니다.

제품 테이블에 3개의 제품을 삽입했다고 가정하면, 수량은 10,

3개 제품 구매 1: o(gid,much) 값(1,3)$에 삽입

이때, 제품 1의 수량 7;

입력된 주문 기록을 수정합니다. update o set much = 5 where oid = 1$

제품 1의 5개 항목을 구매하도록 변경합니다. 이때 제품 테이블을 쿼리하면 다음을 찾을 수 있습니다. 제품 1의 수량은 5개에 불과합니다. 이는 트리거가 작동 중임을 나타냅니다.

위 내용은 이 기사의 트리거에 관한 모든 내용입니다. 도움이 되기를 바랍니다.

관련 추천:

MySQL 트리거에 대한 질문

MySQL의 인덱스 및 트리거에 대한 자세한 설명

MySQL의 트리거 작동 예에 대한 자세한 설명

위 내용은 mysql 트리거에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿