Maison >base de données >tutoriel mysql >Explication détaillée des déclencheurs MySQL
Qu'est-ce qu'un déclencheur :
Le déclencheur est une méthode fournie par le serveur SQL aux programmeurs et aux analystes de données pour garantir l'intégrité des données. Il s'agit d'un stockage spécial lié aux événements de table, son exécution n'est pas appelée par. un programme ou démarré manuellement, mais est déclenché par des événements. Par exemple, lorsqu'une table est exploitée (insertion, suppression, mise à jour), son exécution sera activée. Les déclencheurs sont souvent utilisés pour appliquer des contraintes d’intégrité des données et des règles métier. Les déclencheurs peuvent être trouvés dans les dictionnaires de données DBA_TRIGGERS et USER_TRIGGERS. Un déclencheur SQL3 est une instruction qui peut être automatiquement exécutée par le système pour modifier la base de données.
Syntaxe du déclencheur :
CREATE TRIGGER 58e8da683a191e3c88cfe7d78e93fa03 --Le déclencheur doit avoir un nom, jusqu'à 64 caractères, et peut être suivi d'un délimiteur. C'est le même que dans. MySQL Les méthodes de dénomination des autres objets sont fondamentalement similaires.
{ BEFORE | AFTER } --Le déclencheur a un paramètre de temps d'exécution : il peut être défini avant ou après que l'événement se produise.
{ INSERT | UPDATE | DELETE } --Vous pouvez également définir les événements déclenchés : ils peuvent être déclenchés lors de l'exécution d'une insertion, d'une mise à jour ou d'une suppression.
ON 87031497877ef0fde159265152a1fea9 --Le déclencheur appartient à une certaine table : lorsqu'une opération d'insertion, de mise à jour ou de suppression est effectuée sur cette table, le déclencheur est activé. l'événement planifie deux déclencheurs.
FOR EACH ROW --Intervalle d'exécution du déclencheur : la clause FOR EACH ROW notifie au déclencheur d'effectuer une action toutes les deux lignes, plutôt qu'une fois pour la table entière.
dad1c87a8bce8505eb85642767d38b06 --Le déclencheur contient l'instruction SQL à déclencher : l'instruction ici peut être n'importe quelle instruction légale, y compris les instructions composées, mais les instructions ici sont soumises aux mêmes restrictions que les fonctions.
Un seul déclencheur peut être créé pour une table.
Déclencheur : surveiller une certaine situation et déclencher une certaine opération.
Quatre éléments de syntaxe de création de déclencheur : 1. Emplacement de surveillance (table) 2. Événement de surveillance (insertion/mise à jour/suppression) 3. Heure de déclenchement (après/avant) 4. Événement déclencheur (insertion/mise à jour/suppression) ) )
Syntaxe :
create trigger triggerName after/before insert/update/delete on 表名 for each row #这句话在mysql是固定的 begin
sql Statement;
end;
Remarque : Chaque couleur correspond aux quatre éléments ci-dessus.
Nous créons d'abord deux tableaux :
#商品表 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('商品1',10),('商品2',10),('商品3',10);
Si nous n'utilisons pas de déclencheurs : Supposons que nous vendions 3 articles 1 maintenant, nous devons faire deux choses
1 . Insérez un enregistrement dans le tableau des commandes
insert into o(gid,much) values(1,3);
2 Mettez à jour la quantité restante de l'article 1 dans le tableau des produits
update g set num=num-3 where id=1;
Maintenant, créons un déclencheur :
Vous devez d'abord exécuter cette instruction : délimiteur $ (c'est-à-dire dire à l'instruction mysql de se terminer par $)
create trigger tg1 after insert on o for each row begin update g set num=num-3 where id=1; end$
À ce stade, il nous suffit d'exécuter :
insert into o(gid,much) values(1,3)$
Vous constaterez que la quantité du produit 1 est passée à 7, ce qui signifie que lorsque nous insérons une commande, le déclencheur effectue automatiquement l'opération de mise à jour pour nous.
Mais maintenant, il y a un problème, car le numéro et l'identifiant de notre déclencheur sont codés en dur, donc quel que soit le produit que nous achetons, la quantité du produit 1 sera finalement mise à jour. Par exemple : nous insérons un autre enregistrement dans la table de commande : insert into o(gid,beaucoup) valeurs(2,3) Après exécution, nous constaterons que la quantité de produit 1 est passée à 4, mais la quantité de produit 2). n’a pas changé. Ce n’est évidemment pas le cas des résultats que nous souhaitons. Nous devons modifier le déclencheur que nous avons créé plus tôt.
Comment référencer la valeur de la ligne dans le déclencheur, c'est-à-dire que nous devons obtenir la valeur de gid ou much dans notre enregistrement de commande nouvellement inséré.
Pour l'insertion, la ligne nouvellement insérée est représentée par new et la valeur de chaque colonne de la ligne est représentée par new.column name.
Alors maintenant, nous pouvons changer notre déclencheur comme ceci
create trigger tg2 after insert on o for each row begin update g set num=num-new.much where id=new.gid;(注意此处和第一个触发器的不同) end$
Le deuxième déclencheur est créé, supprimons d'abord le premier déclencheur
drop trigger tg1$
Testez-le à nouveau et insérez un enregistrement de commande : insérez dans o(gid,much) values(2,3)$
Après exécution, il s'avère que la quantité du produit 2 est passée à 7. D'accord, c'est maintenant.
Il existe encore deux situations :
1. Lorsqu'un utilisateur annule une commande, nous supprimons directement une commande. Devons-nous rajouter la quantité de marchandise correspondante ?
2. Lorsque l'utilisateur modifie la quantité d'une commande, comment écrit-on le déclencheur de modification ?
Analysons d'abord la première situation :
Lieu de suivi : o table
Événement de surveillance : supprimer
Heure de déclenchement : après
Événement de déclenchement : mise à jour
Pour suppression : il y avait à l'origine une ligne, mais elle a été supprimée plus tard , je pense que pour référencer la ligne supprimée, utilisez old pour la représenter. L'ancien nom de colonne peut faire référence à la valeur de la ligne supprimée.
Ensuite notre déclencheur devrait s'écrire ainsi :
create trigger tg3 after delete on o for each row begin update g set num = num + old.much where id = old.gid;(注意这边的变化) end$
Création terminée.
Exécutez delete from o Where oid = 2$
et vous constaterez que la quantité de produit 2 est à nouveau passée à 10.
Deuxième cas :
Lieu de surveillance : o table
Événement de surveillance : mise à jour
Heure de déclenchement : après
événement déclencheur : mise à jour
Pour mise à jour : la ligne modifiée, les données avant modification, représentées par old, old Le nom de la colonne fait référence à la valeur dans la ligne avant modification
après modification Les données sont représentées par ; new, et le nom de la colonne new fait référence à la valeur de la ligne après sa modification.
Ensuite, notre déclencheur doit s'écrire comme ceci :
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$
Restaurez d'abord l'ancienne quantité puis soustrayez la nouvelle quantité pour obtenir la quantité modifiée.
Testons-le : effacez d’abord les données du tableau des produits et du tableau des commandes pour faciliter le test.
Supposons que nous insérons trois produits dans la table des produits, les quantités sont toutes 10,
Achetez 3 produits 1 : insérez dans o(gid,much) valeurs(1,3)$
A ce moment, la quantité du produit 1 devient 7 ;
Nous modifions l'enregistrement de commande inséré : mettre à jour ou définir beaucoup = 5 où oid = 1$
Nous changeons pour acheter 5 Produit 1. Si vous interrogez la table des produits à ce moment-là, vous constaterez que le numéro du produit 1 n'est que de 5, ce qui indique que notre déclencheur a fonctionné.
Ce qui précède concerne uniquement les déclencheurs dans cet article, j'espère que cela pourra vous aider.
Recommandations associées :
Questions sur les déclencheurs MySQL
Explication détaillée des index et des déclencheurs dans MySQL
Explication détaillée des exemples d'opérations de déclencheurs dans Mysql
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!