Maison  >  Article  >  base de données  >  Comment utiliser le déclencheur dans la base de données MySQL

Comment utiliser le déclencheur dans la base de données MySQL

王林
王林avant
2023-05-28 17:31:062474parcourir

    1. Concept de base

    Un déclencheur est un type spécial de procédure stockée, le déclencheur est déclenché par l'événement et est exécuté

    Le déclencheur du déclencheur est similaire à l'événement js

    1 Fonction

    • #🎜. 🎜#Avant d'écrire dans la table de données, forcez la vérification ou la conversion des données (pour assurer la sécurité des données)

    • Lorsqu'une erreur de déclenchement se produit, le résultat de la modification sera annulé (sécurité des transactions)

    • Certains systèmes de gestion de bases de données peuvent utiliser des déclencheurs pour le langage de définition de données DDL, appelés déclencheurs DDL

    • # 🎜🎜 #Vous pouvez remplacer les instructions de transaction en fonction de circonstances spécifiques (mysql ne prend pas en charge)
    • 2 Avantages et inconvénients des déclencheurs
    #🎜. 🎜#2.1 , Avantages

    Les déclencheurs peuvent réaliser des modifications en cascade via des tables associées dans la base de données (si les données d'une table changent, les déclencheurs peuvent être utilisés pour implémenter des opérations sur d'autres tables, l'utilisateur ne le sait pas)
    • Assurer la sécurité des données et effectuer une vérification de sécurité
    • 2.2, Inconvénients #🎜 🎜#
    Une dépendance excessive aux déclencheurs affectera inévitablement la structure de la base de données et augmentera la complexité de la maintenance
    • Les données sont incontrôlables au niveau du programme

    • 2. Créez des déclencheurs

    • 1, syntaxe de base
    create trigger 触发器名字 触发时机 触发事件 on 表 for each row
    begin
    end

    2. Objet déclencheur

    sur la table pour chaque ligne Le déclencheur lie toutes les lignes de la table Lorsqu'une ligne a un changement spécifié, le déclencheur sera déclenché

    #🎜. 🎜#3. Synchronisation du déclenchement

    Les lignes correspondant à chaque table ont des états différents. Lorsque la commande SQL est exécutée, les données de la ligne changeront toujours : avant et après les données. opération

    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

    • avant : L'état avant le changement des données

    après : Les données L'état modifié#🎜 🎜#

    4. Événement déclencheur

    La cible du déclencheur dans MySQL est le changement de données, et l'opération correspondante est uniquement une opération d'écriture (ajouter, supprimer, modifier) ​​

    inert Opération d'insertion
    • update Opération de mise à jour
    • #🎜 🎜#
    • supprimer l'opération de suppression

    5. NotesDans un tableau, chaque temps de déclenchement est lié Le type de déclencheur correspondant à l'événement déclencheur ne peut en avoir qu'un seul

    Il ne peut y avoir qu'un seul déclencheur correspondant après insertion d'un déclencheur dans une table Il ne peut y avoir que 6 déclencheurs au maximum Appareil

    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 ;

    Demande :

    Ordre de réduction des stocks

    Il y a deux tables, l'une est la table des produits, l'autre est la commande table (en conservant l'ID du produit). Chaque fois qu'une commande est générée, l'inventaire correspondant dans la table des produits doit changer

    Créer deux tables : #🎜🎜##🎜🎜 #
    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 |
    +----+--------+-------+
    #. 🎜🎜##🎜🎜#Créer un déclencheur : #🎜🎜##🎜🎜##🎜🎜#Si l'insertion de données se produit dans le tableau de commande, le produit correspondant doit être réduit en stock#🎜🎜#
    -- 删除原有触发器
    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 ;
    #🎜🎜#三, afficher le déclencheur #🎜🎜#
    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. Déclenchez le déclencheur #🎜🎜##🎜🎜# Laissez le déclencheur s'exécuter et laissez l'opération correspondante se produire à l'heure correspondante dans le tableau spécifié par le déclencheur #🎜🎜 # rrreee#🎜🎜# 5. Supprimer le déclencheur#🎜🎜#rrreee#🎜🎜# 6. Déclencher l'application#🎜🎜##🎜🎜#Enregistrer le mot clé nouveau ancien#🎜🎜##🎜🎜#6.Parfait# 🎜🎜# #🎜🎜#Les articles déduisent automatiquement l'inventaire#🎜🎜##🎜🎜#Le déclencheur cible chaque enregistrement de la table de données, et chaque ligne de données a un statut correspondant avant et après l'opération#🎜🎜##🎜 🎜##🎜 🎜#Le déclencheur obtient l'état des données correspondant avant exécution : #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#enregistrer l'état des données avant toute opération dans le mot-clé #🎜🎜##🎜🎜 ##🎜🎜##🎜🎜# dans le mot clé old, le statut après l'opération est placé en new #🎜🎜##🎜🎜 ##🎜🎜## 🎜🎜#Dans le déclencheur, vous pouvez utiliser l'ancien et le nouveau pour obtenir les données d'enregistrement correspondantes dans la table de liaison #🎜🎜##🎜🎜##🎜🎜#Syntaxe de base : #🎜🎜##🎜🎜 ##🎜🎜# #🎜🎜#Keyword.Field name#🎜🎜##🎜🎜##🎜🎜#l'ancien et le nouveau ne sont pas disponibles pour tous les déclencheurs #🎜🎜##🎜🎜##🎜🎜##🎜 🎜#insert est vide avant l'insertion , aucun ancien#🎜🎜##🎜🎜##🎜🎜##🎜🎜#delete n'efface les données, aucun nouveau#🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜 🎜#Article déduction automatique de inventaire : #🎜🎜##🎜🎜#rrreee#🎜🎜##🎜🎜# Déclencheur : #🎜🎜##🎜🎜#rrreee#🎜🎜#2 Optimisation #🎜🎜## 🎜🎜##🎜🎜#Quoi. dois-je faire si la quantité en stock n'est pas aussi importante que la commande de produits ? #🎜🎜##🎜🎜#rrreee#🎜🎜##🎜🎜#Vérification des résultats : #🎜🎜##🎜🎜#rrreee

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer