Maison  >  Article  >  base de données  >  Explication détaillée des exemples d'utilisation de déclencheurs dans MySQL

Explication détaillée des exemples d'utilisation de déclencheurs dans MySQL

黄舟
黄舟original
2017-06-04 10:01:211316parcourir

Cet article présente principalement les informations pertinentes de mysql Trigger des exemples d'utilisation détaillés. Les amis dans le besoin peuvent se référer à

MySQL Explication détaillée. de la syntaxe du déclencheur  :

Le déclencheur déclencheur est une procédure stockée spéciale , qui insère ( dansensemble ), supprimer (supprimer) ou modifier (update) déclenchent l'exécution lorsque les données d'une table spécifique sont plus petites que les données. les fonctions standard elles-mêmes offrent des capacités de contrôle des données plus sophistiquées et complexes. Le déclencheur n'est pas appelé par le programme, mais déclenché par un certain événement. Appliquer automatiquement les règles métier lorsque les données sont modifiées, souvent utilisées pour renforcer l'intégrité des données contraintes et les règles métier, etc. Les déclencheurs peuvent interroger d'autres tables et contenir des instructions SQL répliquées. Les déclencheurs peuvent également être utilisés pour renforcer l’intégrité de la référence. Les déclencheurs peuvent appliquer des contraintes plus complexes que celles définies avec des contraintes de vérification.

(1).Syntaxe CREATE TRIGGER

CREATE TRIGGER trigger_nametrigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt;
Un déclencheur est un objet de base de données nommé associé à une table qui sera activé lorsqu'un événement spécifique se produit sur la table.
Le déclencheur est lié à la table nommée tbl_name. tbl_name doit faire référence à une table permanente. Impossible d'associer un déclencheur à une table ou une vue TEMPORAIRE.
trigger_time est le temps d'action du programme déclencheur. Il peut s'agir de AVANT ou APRÈS pour indiquer si le déclencheur est déclenché avant ou après l'instruction qui l'active.
trigger_event spécifie le type d'instruction qui active le programme déclencheur. trigger_event peut avoir l'une des valeurs suivantes :

(1).INSERT : Le déclencheur est activé lorsqu'une nouvelle ligne est insérée dans le tableau, par exemple via INSERT, LOAD DATA et REPLACE
déclarations.
(2).UPDATE : Le déclencheur est activé lorsqu'une ligne est modifiée, par exemple via l'instruction UPDATE.
(3).DELETE : le déclencheur est activé lorsqu'une ligne est supprimée de la table, par exemple via les instructions DELETE et REPLACE.

Il est important de noter que trigger_event n'est pas très similaire à l'instruction SQL qui active le programme déclencheur via des opérations de table. Par exemple, le déclencheur BEFORE sur INSERT peut être activé non seulement par l'instruction INSERT, mais également par l'instruction LOAD DATA. Un exemple qui peut prêter à confusion est INSERT INTO .. ​​​​ON DUPLICATE UPDATE... Syntaxe : le déclencheur BEFORE INSERT s'activera pour chaque ligne, suivi du déclencheur AFTER INSERT, ou du déclencheur BEFORE UPDATE et AFTER UPDATE, selon Y a-t-il des clés en double activées la rangée.

Il ne peut pas y avoir deux déclencheurs pour une table donnée avec le même moment d'action et le même événement de déclenchement. Par exemple, pour une certaine table, il ne peut pas y avoir deux déclencheurs BEFORE UPDATE. Mais il peut y avoir 1 déclencheur BEFORE UPDATE et 1 déclencheur BEFORE INSERT, ou 1 déclencheur BEFOREUPDATE et 1 déclencheur AFTER UPDATE. trigger_stmt est l'instruction exécutée lorsque le déclencheur est activé. Si vous prévoyez d'exécuter plusieurs instructions, vous pouvez utiliser la structure d'instruction composée BEGIN ... END. De cette façon, vous pouvez utiliser les mêmes instructions autorisées dans les sous-programmes stockés

(2) Syntaxe DROP TRIGGER

DROP TRIGGER[schema_name. ] trigger_name supprime le programme déclencheur. Le nom du schéma (schema_name) est facultatif. Si le schéma est omis, le déclencheur sera supprimé du schéma actuel.

Remarque : Lors de la mise à niveau d'une version de MySQL antérieure à MySQL 5.0.10 vers 5.0.10 ou version ultérieure (y compris toutes les versions de MySQL 5.1), tous les déclencheurs doivent être supprimés avant la mise à niveau et les recréer ultérieurement, sinon. DROP TRIGGER ne fonctionne pas après la mise à niveau. L'instruction DROP TRIGGER nécessite l'autorisation SUPER.

(3). Utilisation du programme de déclenchement

Dans cette section, nous présentons la méthode d'utilisation du programme de déclenchement dans MySQL 5.1 et présentons Il existe restrictions sur l’utilisation des déclencheurs.

Un déclencheur est un objet de base de données nommé associé à une table qui sera activé lorsqu'un événement spécifique se produit sur la table. Dans certaines utilisations de déclencheurs, il peut être utilisé pour vérifier des valeurs insérées dans un tableau, ou pour effectuer des calculs sur des valeurs impliquées dans une mise à jour.

Le programme déclencheur est lié à la table. Lorsqu'une instruction INSERT, DELETE ou UPDATE est exécutée sur la table, le programme déclencheur sera activé. Les déclencheurs peuvent être configurés pour s’activer avant ou après l’exécution d’une instruction. Par exemple, un déclencheur peut être activé avant la suppression de chaque ligne du tableau ou après la mise à jour de chaque ligne. Pour créer un déclencheur ou supprimer un déclencheur, utilisez l'instruction CREATE TRIGGER ou DROP TRIGGER. Un déclencheur ne peut pas appeler une procédure stockée qui renvoie des données au client, ni utiliser du SQL dynamique à l'aide de l'instruction CALL ( qui permet le stockage. Le programme renvoie les données au programme déclencheur via des paramètres).

Le déclencheur ne peut pas utiliser d'instructions qui démarrent ou terminent explicitement ou implicitement des transactions, telles que START TRANSACTION,
COMMIT ou ROLLBACK.

Utilisez les mots-clés OLD et NEW pour accéder aux colonnes des lignes affectées par le déclencheur (OLD et NEW ne sont pas sensibles à la casse).

Dans le déclencheur INSERT, seul NEW.col_name peut être utilisé, pas d'anciennes lignes. Dans un déclencheur DELETE, seul OLD.col_name peut être utilisé, aucune nouvelle ligne. Dans le déclencheur UPDATE, vous pouvez utiliser OLD.col_name pour faire référence à une colonne dans une ligne avant la mise à jour, ou NEW.col_name pour faire référence à une colonne dans la ligne mise à jour.

Les colonnes nommées avec OLD sont en lecture seule. Vous pouvez le référencer, mais pas le modifier. Pour les colonnes nommées avec NEW, vous pouvez y faire référence si vous disposez de l'autorisation SELECT. Dans le programme déclencheur BEFORE, si vous disposez de l'autorisation UPDATE, vous pouvez utiliser "SET NEW.col_name = value" pour modifier sa valeur. Cela signifie que vous pouvez utiliser des déclencheurs pour modifier les valeurs qui seront insérées dans de nouvelles lignes ou pour mettre à jour les valeurs dans les lignes. Dans le programme déclencheur BEFORE, la valeur NEW de la colonne AUTO_INCREMENT est 0, ce qui n'est pas le numéro de séquence qui sera automatiquement généré lorsqu'un nouvel enregistrement est effectivement inséré.

En utilisant la structure BEGIN ...END, vous pouvez définir un programme déclencheur qui exécute plusieurs instructions. Dans le bloc BEGIN, vous pouvez également utiliser d'autres syntaxes autorisées dans les sous-programmes stockés, telles que les conditions et les boucles , etc. Cependant, tout comme les sous-programmes stockés, lors de la définition d'un programme déclencheur qui exécute plusieurs instructions, si utilise le programme mysql pour entrer dans le programme déclencheur, le séparateur d'instructions doit être redéfini pour pouvoir utiliser le caractère " dans la définition du programme déclencheur ;". Dans l’exemple suivant, ces points sont démontrés. Dans cet exemple, un déclencheur UPDATE est défini qui vérifie la nouvelle valeur qui sera utilisée lors de la mise à jour de chaque ligne et modifie la valeur afin qu'elle soit comprise entre 0 et 100. Il doit s'agir d'un déclencheur BEFORE car la valeur doit être vérifiée avant d'être utilisée pour mettre à jour la ligne :

mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
   -> FOR EACH ROW
   -> BEGIN
   -> IF NEW.amount < 0 THEN
   -> SET NEW.amount = 0;
   -> ELSEIF NEW.amount > 100 THEN
   -> SET NEW.amount = 100;
   -> END IF;
   -> END;//
mysql> delimiter ;

Il est plus facile de définir la procédure stockée séparément, puis d'utiliser une simple instruction CALL pour appeler une procédure stockée. procédure d’une procédure de déclenchement. Cette méthode est également utile si vous prévoyez d'appeler le même sous-programme à partir de plusieurs programmes déclencheurs. Lors de l'exécution du programme déclencheur, MySQL gère les erreurs comme suit :

(1) Si le programme déclencheur BEFORE échoue, l'opération sur la ligne correspondante ne sera pas effectuée.
(2) Le déclencheur AFTER n'est exécuté que si le déclencheur BEFORE (le cas échéant) et l'opération sur la ligne ont été exécutés avec succès.
(3) Si une erreur se produit lors de l'exécution du programme déclencheur AVANT ou APRES, cela entraînera l'échec de l'intégralité de l'instruction qui appelle le programme déclencheur.
(4) Pour les tables transactionnelles, si le programme déclencheur échoue (et l'échec de l'instruction entière qui en résulte), toutes les modifications effectuées par l'instruction seront annulées. Pour les tables non transactionnelles, ce type de restauration ne peut pas être effectué, donc même si l'instruction échoue, toutes les modifications apportées avant l'échec sont toujours valides.

Exemple 1 :

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn