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

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

王林
王林앞으로
2023-05-28 17:31:062504검색

    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🎜🎜트리거:🎜🎜rrreee🎜2. 재고 수량이 그만큼 많지 않으면 어떻게 해야 합니까? 제품 주문? 🎜🎜rrreee🎜🎜결과 확인:🎜🎜rrreee

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

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제