MySQL 데이터베이스에서 트리거를 사용하는 방법

王林
풀어 주다: 2023-05-28 17:31:06
앞으로
2410명이 탐색했습니다.

    1. 기본 개념

    트리거는 이벤트에 의해 트리거되고 실행되는 특수한 유형입니다.

    트리거는 js 이벤트와 유사합니다

    1.

      데이터 테이블에 쓰기 전 데이터 강제 검증 또는 변환(데이터 보안 보장)
    • 트리거 오류 발생 시 변경 결과가 취소됨(트랜잭션 보안)
    • 일부 데이터베이스 관리 시스템은 데이터에 대한 언어를 정의할 수 있습니다. DDL은 DDL 트리거라는 트리거를 사용합니다.
    • 특정 상황에 따라 트랜잭션 지침을 바꾸는 대신(mysql에서는 지원하지 않음)
    • 2. 트리거의 장점과 단점

    2.1 . 장점

      트리거는 데이터베이스의 관련 테이블을 통해 계단식 변경이 가능합니다. (한 테이블의 데이터가 변경되면 트리거를 사용하여 사용자가 알지 못한 채 다른 테이블에 작업을 구현할 수 있습니다.)
    • 데이터 보안을 보장하고 수행합니다. 보안 검증
    • 2.2. 단점
      트리거에 과도하게 의존하면 필연적으로 데이터베이스 구조에 영향을 미치고 유지 관리가 복잡해집니다
    • 프로그램 수준에서 데이터를 제어할 수 없게 만듭니다
    • 2. 생성 트리거

    1. 기본 구문

    create trigger 触发器名字 触发时机 触发事件 on 表 for each row begin end
    로그인 후 복사

    2. 트리거 개체

    각 행에 대한트리거는 테이블의 모든 행을 바인딩합니다.

    3. 트리거 타이밍on 表 for each row触发器绑定表中所有行,没一行发生指定改变的时候,就会触发触发器

    3、触发时机

    每张表对应的行都有不同的状态,当SQL指令发生的时候,都会令行中数据发生改变,每一行总会有两种状态:数据操作前和数据操作后

    • before: 数据发生改变前的状态

    • after: 数据已经发生改变后的状态

    4、触发事件

    mysql中触发器针对的目标是数据发生改变,对应的操作只有写操作(增删改)

    • inert 插入操作

    • update 更新操作

    • delete 删除操作

    5、注意事项

    一张表中,每一个触发时机绑定的触发事件对应的触发器类型只能有一个

    一张表表中只能有一个对应的after insert 触发器

    最多只能有6个触发器

    before insert after insert before update after update before delete after delete
    로그인 후 복사
    需求:

    下单减库存

    有两张表,一张是商品表,一张是订单表(保留商品ID)每次订单生成,商品表中对应的库存就应该发生变化

    创建两张表:

    create table my_item( id int primary key auto_increment, name varchar(20) not null, count int not null default 0 ) comment '商品表'; create table my_order( id int primary key auto_increment, item_id int not null, count int not null default 1 ) comment '订单表'; insert my_item (name, count) values ('手机', 100),('电脑', 100), ('包包', 100); mysql> select * from my_item; +----+--------+-------+ | id | name | count | +----+--------+-------+ | 1 | 手机 | 100 | | 2 | 电脑 | 100 | | 3 | 包包 | 100 | +----+--------+-------+ 3 rows in set (0.00 sec) mysql> select * from my_order; Empty set (0.02 sec)
    로그인 후 복사

    创建触发器:

    如果订单表发生数据插入,对应的商品就应该减少库存

    delimiter $$ create trigger after_insert_order_trigger after insert on my_order for each row begin -- 更新商品库存 update my_item set count = count - 1 where id = 1; end $$ delimiter ;
    로그인 후 복사

    三、查看触发器

    -- 查看所有触发器 show triggers\G *************************** 1. row *************************** Trigger: after_insert_order_trigger Event: INSERT Table: my_order Statement: begin update my_item set count = count - 1 where id = 1; end Timing: AFTER Created: 2022-04-16 10:00:19.09 sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Definer: root@localhost character_set_client: utf8mb4 collation_connection: utf8mb4_general_ci Database Collation: utf8mb4_general_ci 1 row in set (0.00 sec) -- 查看创建语句 show crate trigger 触发器名字; -- eg: show create trigger after_insert_order_trigger;
    로그인 후 복사

    四、触发触发器

    让触发器执行,让触发器指定的表中,对应的时机发生对应的操作

    insert into my_order (item_id, count) values(1, 1); mysql> select * from my_order; +----+---------+-------+ | id | item_id | count | +----+---------+-------+ | 1 | 1 | 1 | +----+---------+-------+ 1 row in set (0.00 sec) mysql> select * from my_item; +----+--------+-------+ | id | name | count | +----+--------+-------+ | 1 | 手机 | 99 | | 2 | 电脑 | 100 | | 3 | 包包 | 100 | +----+--------+-------+ 3 rows in set (0.00 sec)
    로그인 후 복사

    五、删除触发器

    drop trigger 触发器名字; -- eg drop trigger after_insert_order_trigger;
    로그인 후 복사

    六、触发器的应用

    记录关键字 new old

    6.完善

    商品自动扣除库存

    触发器针对的是数据表中的每条记录,每行数据再操作前后都有一个对应的状态

    触发器在执行之前就将对应的数据状态获取到了:

    • 将没有操作之前的数据状态都保存到old关键字中

    • 操作后的状态都放在new

      각 테이블에 해당하는 행의 상태는 다릅니다. SQL 명령이 발생하면 행의 데이터는 항상 데이터 작업 전과 데이터 작업 후의 두 가지 상태를 갖습니다.
    before: 데이터가 변경되기 전의 상태

    after: 데이터가 변경된 후의 상태

    4. Trigger events

    mysql에서 트리거의 대상은 데이터의 변경이며, 그에 따른 연산 쓰기 연산만(추가, 삭제, 수정)

    • inert 삽입 연산

    • update 업데이트 연산

    delete 삭제 연산

    5. 참고 사항

    테이블에는 각 트리거 이벤트가 바인딩되어 있습니다. 트리거 시간에 해당하는 트리거 유형은 하나만 있을 수 있습니다

    테이블에 트리거를 삽입한 후 해당하는 유형은 하나만 있을 수 있습니다

    트리거는 최대 6개까지만 있을 수 있습니다

    delimiter $$ create trigger after_insert_order_trigger after insert on my_order for each row begin -- 通过new关键字获取新数据的id 和数量 update my_item set count = count - new.count where id = new.item_id; end $$ delimiter ;
    로그인 후 복사
    요구 사항:

    줄이기 위해 주문하세요 Inventory

    두 개의 테이블이 있습니다. 하나는 제품 테이블이고 다른 하나는 주문 테이블(제품 ID 유지)입니다. 주문이 생성될 때마다 제품 테이블의 해당 재고가 변경되어야 합니다.두 개의 테이블을 만듭니다.
    mysql> select * from my_order; +----+---------+-------+ | id | item_id | count | +----+---------+-------+ | 1 | 1 | 1 | +----+---------+-------+ mysql> select * from my_item; +----+--------+-------+ | id | name | count | +----+--------+-------+ | 1 | 手机 | 99 | | 2 | 电脑 | 100 | | 3 | 包包 | 100 | +----+--------+-------+ insert into my_order (item_id, count) values(2, 3); mysql> select * from my_order; +----+---------+-------+ | id | item_id | count | +----+---------+-------+ | 1 | 1 | 1 | | 2 | 2 | 3 | +----+---------+-------+ mysql> select * from my_item; +----+--------+-------+ | id | name | count | +----+--------+-------+ | 1 | 手机 | 99 | | 2 | 电脑 | 97 | | 3 | 包包 | 100 | +----+--------+-------+
    로그인 후 복사
    트리거 생성: 주문 테이블에 데이터 삽입이 발생하면 해당 제품의 재고가 감소해야 합니다.
    -- 删除原有触发器 drop trigger after_insert_order_trigger; -- 新增判断库存触发器 delimiter $$ create trigger after_insert_order_trigger after insert on my_order for each row begin -- 查询库存 select count from my_item where id = new.item_id into @count; -- 判断 if new.count > @count then -- 中断操作,暴力抛出异常 insert into xxx values ('xxx'); end if; -- 通过new关键字获取新数据的id 和数量 update my_item set count = count - new.count where id = new.item_id; end $$ delimiter ;
    로그인 후 복사
    3. 트리거 보기
    mysql> insert into my_order (item_id, count) values(3, 101); ERROR 1146 (42S02): Table 'mydatabase2.xxx' doesn't exist mysql> select * from my_order; +----+---------+-------+ | id | item_id | count | +----+---------+-------+ | 1 | 1 | 1 | | 2 | 2 | 3 | +----+---------+-------+ 2 rows in set (0.00 sec) mysql> select * from my_item; +----+--------+-------+ | id | name | count | +----+--------+-------+ | 1 | 手机 | 99 | | 2 | 电脑 | 97 | | 3 | 包包 | 100 | +----+--------+-------+ 3 rows in set (0.00 sec)
    로그인 후 복사
    4. 트리거 트리거 트리거 실행 허용 그리고 트리거에 의해 지정된 테이블을 실행하면 해당 시간에 해당 작업이 발생합니다 rrreee 5. 트리거 삭제 rrreee 6. 트리거 적용 기록 키워드 new old 6. 재고 자동 차감 개선 상품 트리거 대상 데이터 테이블의 각 레코드, 데이터의 각 행에는 작업 전후에 해당 상태가 있습니다트리거는 실행 전에 해당 데이터 상태를 얻습니다. 더 이상 데이터 상태 작업은 모두 old키워드 에 저장됩니다. 작업이 new트리거에 배치된 후의 상태는 old 및 new 고정 테이블의 해당 레코드 데이터기본 구문:키워드. 필드 이름모든 트리거에서 이전 및 새 항목을 사용할 수 없습니다.삽입은 삽입 전에 비어 있으며 이전 항목이 없습니다 삭제 데이터 지우기, 신규 없음아이템 자동 공제:rrreee트리거:rrreee2. 재고 수량이 그만큼 많지 않으면 어떻게 해야 합니까? 제품 주문? rrreee결과 확인:rrreee

    위 내용은 MySQL 데이터베이스에서 트리거를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:yisu.com
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    저자별 최신 기사
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿
    회사 소개 부인 성명 Sitemap
    PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!