MySQL-Trigger und Cursor

Einführung in Trigger

Ein Trigger ist eine spezielle gespeicherte Prozedur, die einer Tabelle zugeordnet ist und die beim Einfügen, Löschen oder Ändern von Daten in die Tabelle ausgeführt werden kann. Sie verfügt über verfeinerte und komplexere Datensteuerungsfunktionen als die Standardfunktionen der Datenbank selbst.

Vorteile von Triggern:

  • Sicherheit: Benutzer können bestimmte Rechte zum Betreiben der Datenbank basierend auf dem Wert der Datenbank haben. Zum Beispiel ist es nicht erlaubt, die Datenbankdaten nach Feierabend und Urlaub zu ändern.
  • Überwachung: Kann die Vorgänge des Benutzers in der Datenbank verfolgen.
  • Implementieren Sie komplexe Datenintegritätsregeln. Zum Beispiel kann der Auslöser alle Futures zurücksetzen, die versuchen, mehr als ihre eigene Marge zu essen.
  • Bietet eine andere Möglichkeit, geplante Aufgaben auszuführen. Wenn das Guthaben auf dem Konto des Unternehmens beispielsweise weniger als 50.000 Yuan beträgt, werden Warndaten sofort an das Finanzpersonal gesendet.

Verwenden Sie Trigger in MySQL

Trigger erstellen

Der Trick beim Erstellen eines Triggers besteht darin, sich die vier Elemente eines Triggers zu merken:

  • Überwachungsort: Tabelle;
  • Überwachungsereignisse: Einfügen / Aktualisieren / Löschen;
  • Auslösezeit: nach / vor;
  • Auslösendes Ereignis: Einfügen / Aktualisieren / Löschen.

Die grundlegende Syntax zum Erstellen eines Triggers lautet wie folgt:


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
  • Triggername: der Name des Triggers;
  • tirgger_time: Trigger-Timing, entweder VOR oder NACH;
  • trigger_event: Triggerereignis, INSERT, DELETE oder UPDATE;
  • tb_name: Gibt den Namen der Tabelle an, in der der Trigger erstellt wird, und in welcher Tabelle der Trigger erstellt wird.
  • trigger_stmt: Der Hauptteil des Triggers, der eine SQL-Anweisung oder mehrere in BEGIN und END enthaltene Anweisungen sein kann.
  • FÜR JEDE REIHE bedeutet, dass jede Operation in einem Datensatz, die das Triggerereignis erfüllt, den Trigger auslöst.
    Hinweis: Für dasselbe Triggerereignis mit derselben Triggerzeit in derselben Tabelle kann nur ein Trigger definiert werden.

Neue und alte Datensätze auslösen

NEW und OLD werden in MySQL definiert, um die Datenzeile, die den Trigger ausgelöst hat, in der Tabelle anzugeben, in der sich der Trigger befindet:

  • Im INSERT-Trigger wird NEW verwendet, um die neuen Daten darzustellen, die (VOR oder NACH) eingefügt werden.
  • Im UPDATE-Typ-Trigger wird OLD verwendet, um die ursprünglichen Daten darzustellen, die geändert werden oder wurden, und NEW wird verwendet, um die neuen Daten darzustellen, die geändert werden oder wurden.
  • Im DELETE-Trigger wird OLD verwendet, um die Originaldaten anzugeben, die gelöscht werden oder wurden.

Erstellen Sie einen Auslöser. Wenn ein Benutzer ein Produkt kauft, wird gleichzeitig der entsprechende Produktbestandsdatensatz aktualisiert. Der Code lautet wie folgt:

-- 删除触发器,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;

Erstellen Sie einen Auslöser. Wenn der Benutzer eine Bestellung löscht, wird gleichzeitig der entsprechende Produktbestandsdatensatz aktualisiert. Der Code lautet wie folgt:

-- 创建触发器
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;

Der Unterschied zwischen vorher und nachher

vor vor dem Ausführen der Anweisung nach nach dem Ausführen der Anweisung

Wenn die Bestellmenge den Lagerbestand überschreitet, ändern Sie die Bestellmenge auf den maximalen Lagerbestand:

-- -- 创建 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;

Mauszeiger

Einführung in Cursor

Die Funktion des Cursors besteht darin, die durch Abfragen der Datenbank zurückgegebenen Datensätze zu durchlaufen, um entsprechende Operationen auszuführen. Der Cursor hat die folgenden Eigenschaften

  • Der Cursor ist schreibgeschützt, dh er kann nicht aktualisiert werden.
  • Der Cursor kann nicht gescrollt werden, dh er kann nur in eine Richtung bewegt werden und kann sich nicht nach Belieben zwischen Datensätzen vorwärts und rückwärts bewegen und bestimmte Datensätze nicht überspringen.
  • Vermeiden Sie das Aktualisieren von Daten in Tabellen, in denen Cursor geöffnet wurden.

Cursor erstellen

Die Syntax zum Erstellen eines Cursors besteht aus vier Teilen:

  • Cursor definieren: Deklarieren Sie den Cursornamen-Cursor für die select-Anweisung.
  • Cursor öffnen: Cursorname öffnen;
  • Holen Sie sich das Ergebnis: Cursorname in Variablenname holen [, Variablenname];
  • Schließen Sie den Cursor: Schließen Sie den Cursornamen.

Erstellen Sie eine Prozedur p1, und geben Sie mit dem Cursor die ersten Schülerinformationen in der Schülertabelle in der Testdatenbank zurück. Der Code lautet wie folgt:

-- 定义过程
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();

Erstellen Sie eine student2-Tabelle in der Testdatenbank, erstellen Sie einen Prozess p2, extrahieren Sie mit dem Cursor alle studentischen Informationen in der student-Tabelle und fügen Sie sie in die student2-Tabelle ein. Der Code lautet wie folgt:

-- 定义过程
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;

Ich denke du magst

Origin blog.csdn.net/chaotiantian/article/details/114797795
Empfohlen
Rangfolge