Déclencheurs et curseurs MySQL

Introduction aux déclencheurs

Un déclencheur est une procédure stockée spéciale associée à une table, qui peut être déclenchée pour s'exécuter lors de l'insertion, de la suppression ou de la modification de données dans la table. Il possède des capacités de contrôle des données plus raffinées et plus complexes que les fonctions standard de la base de données elle-même.

Avantages des déclencheurs:

  • Sécurité: les utilisateurs peuvent avoir certains droits pour exploiter la base de données en fonction de la valeur de la base de données. Par exemple, il n'est pas permis de modifier les données de la base de données après le congé et les vacances;
  • Audit: peut suivre les opérations de l'utilisateur sur la base de données;
  • Mettez en œuvre des règles d'intégrité des données complexes. Par exemple, le déclencheur peut annuler tout futur qui tente de manger plus que sa propre marge;
  • Fournit un autre moyen d'exécuter des tâches planifiées. Par exemple, si les fonds sur le compte de l'entreprise sont inférieurs à 50 000 yuans, des données d'avertissement seront immédiatement envoyées au personnel financier.

Utiliser des déclencheurs dans MySQL

Créer un déclencheur

L'astuce pour créer un déclencheur est de se souvenir des quatre éléments d'un déclencheur:

  • Lieu de surveillance: table;
  • Surveillance des événements: insérer / mettre à jour / supprimer;
  • Temps de déclenchement: après / avant;
  • Événement déclencheur: insérer / mettre à jour / supprimer.

La syntaxe de base pour créer un déclencheur est la suivante:


CREATE TRIGGER
-- trigger_name:触发器的名称; 
--  tirgger_time:触发时机,为 BEFORE 或者 AFTER;
--  trigger_event:触发事件,为 INSERT、DELETE 或者 UPDATE; 
 trigger_name trigger_time trigger_event 
 ON
 --  tb_name:表示建立触发器的表名,在哪张表上建立触发器;
 tb_name
 -- FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发该触发器。
 FOR EACH ROW
 -- trigger_stmt:触发器的程序体,可以是一条 SQL 语句或者是用 BEGIN 和 END 包含的多条语句; 
 trigger_stmt
  • trigger_name: le nom du trigger;
  • tirgger_time: temps de déclenchement, soit AVANT, soit APRÈS;
  • trigger_event: événement de déclenchement, qui est INSERT, DELETE ou UPDATE;
  • tb_name: indique le nom de la table où le déclencheur est créé, et sur quelle table le déclencheur est créé;
  • trigger_stmt: Le corps du déclencheur, qui peut être une instruction SQL ou plusieurs instructions contenues dans BEGIN et END;
  • FOR EACH ROW signifie que toute opération sur un enregistrement qui rencontre l'événement déclencheur déclenchera le déclencheur.
    Remarque: pour le même événement de déclenchement avec la même heure de déclenchement dans la même table, un seul déclenchement peut être défini.

Déclenchez de nouveaux et anciens enregistrements

NEW et OLD sont définis dans MySQL pour indiquer la ligne de données qui a déclenché le déclencheur dans la table où se trouve le déclencheur:

  • Dans le déclencheur INSERT, NEW est utilisé pour représenter les nouvelles données qui seront (AVANT ou APRÈS) insérées;
  • Dans le déclencheur de type UPDATE, OLD est utilisé pour représenter les données d'origine qui seront ou qui ont été modifiées, et NEW est utilisé pour représenter les nouvelles données qui seront ou ont été modifiées;
  • Dans le déclencheur DELETE, OLD est utilisé pour indiquer les données d'origine qui seront ou ont été supprimées.

Créez un déclencheur. Lorsqu'un utilisateur achète un produit, l'enregistrement d'inventaire produit correspondant est mis à jour en même temps. Le code est le suivant:

-- 删除触发器,drop trigger 触发器名称
-- if exists判断存在才会删除
drop trigger if exists myty1;
-- 创建触发器
create trigger mytg1-- myty1触发器的名称
after insert on orders-- orders在哪张表上建立触发器;
for each row
begin
	update product set num = num-new.num where pid=new.pid;
end;
-- 往订单表插入记录
insert into orders values(null,2,1);
-- 查询商品表商品库存更新情况
select * from product;

Créez un déclencheur. Lorsque l'utilisateur supprime une commande, l'enregistrement d'inventaire produit correspondant est mis à jour en même temps. Le code est le suivant:

-- 创建触发器
create trigger mytg2
after delete on orders
for each ROW
begin 
-- 对库存进行回退,重新加上
	update product set num = num+old.num where pid=old.pid;
end;
-- 删除订单记录
delete from orders where oid = 2;
-- 查询商品表商品库存更新情况
select * from product;

La différence entre avant et après

avant avant d'exécuter l'instruction après après avoir exécuté l'instruction

Lorsque la quantité de commande dépasse l'inventaire, modifiez la quantité de commande à l'inventaire maximum:

-- -- 创建 before 触发器
create trigger mytg3
before insert on orders
for each row 
begin 
	-- 定义一个变量,来接收库存
	declare n int default 0;
	-- 查询库存 把num赋值给n
	select num into n from product where pid = new.pid;
	-- 判断下单的数量是否大于库存量
	if new.num>n then
		-- 大于修改下单库存(库存改为最大量)
	set new.num = n;
	end if;
	update product set num = num-new.num where pid=new.pid;
end;
-- 往订单表插入记录
insert into orders values(null,3,50);
-- 查询商品表商品库存更新情况
select * from product;
-- 查询订单表
select * from orders;

le curseur

Introduction aux curseurs

La fonction du curseur est de parcourir les enregistrements retournés en interrogeant la base de données afin d'effectuer les opérations correspondantes. Le curseur a les caractéristiques suivantes

  • Le curseur est en lecture seule, c'est-à-dire qu'il ne peut pas être mis à jour;
  • Le curseur ne peut pas faire défiler, c'est-à-dire qu'il ne peut être parcouru que dans une direction, et ne peut pas avancer et reculer d'un enregistrement à volonté, et ne peut pas sauter certains enregistrements;
  • Évitez de mettre à jour les données sur les tables qui ont ouvert des curseurs.

Créer un curseur

La syntaxe de création d'un curseur se compose de quatre parties:

  • Définir le curseur: déclarer le curseur du nom du curseur pour l'instruction de sélection;
  • Curseur ouvert: nom du curseur ouvert;
  • Obtenez le résultat: récupérez le nom du curseur dans le nom de la variable [, nom de la variable];
  • Fermez le curseur: fermez le nom du curseur;

Créez une procédure p1, utilisez le curseur pour renvoyer les premières informations sur les étudiants dans la table des étudiants dans la base de données de test. Le code est comme suit:

-- 定义过程
create procedure p1()
begin 
	declare id int;
	declare name varchar(20);
	declare age int;
	-- 定义游标  declare 游标名 cursor for select 语句;
	declare mc cursor for select * from student;
	-- 打开游标 open 游标名;
	open mc;
	-- 获取数据 fetch 游标名 into 变量名[,变量名];
	fetch mc into id,name,age;
	-- 打印
	select id,name,age;
	-- 关闭游标
	close mc;
end;
-- 调用过程
call p1();

Créez une table student2 dans la base de données de test, créez un processus p2, utilisez le curseur pour extraire toutes les informations étudiant dans la table student et insérez-la dans la table student2. Le code est comme suit:

-- 定义过程
create procedure p3()
begin 
	declare id int;
	declare name varchar(20);
	declare age int;
	declare flag int default 0;
	-- 定义游标  declare 游标名 cursor for select 语句;
	declare mc cursor for select * from student;
	declare continue handler for not found set flag=1;
	-- 打开游标 open 游标名;
	open mc;
	-- 获取数据 fetch 游标名 into 变量名[,变量名];
	a:loop -- 循环获取数据
	fetch mc into id,name,age;
	if flag=1 then -- 当无法fetch时触发continue handler
	leave a;-- 终止循环
	end if;
	-- 进行遍历,将提取的每一行数据插入到 student2 表中
	insert into student2 values(id,name,age);
	end loop;
	-- 关闭游标
	close mc;
end;
-- 调用过程
call p3();
-- 查询 student2 表
select * from student2;

Je suppose que tu aimes

Origine blog.csdn.net/chaotiantian/article/details/114797795
conseillé
Classement