MySQL触发器trigger之foreachrow

for each row 每行受影响,触发器都施行,叫行级触发器。 oracle
触发器中分行级触发器和语句级触发器,可不写for each
row,无论影响多少行都只进行三次。 mysql不协助语句触发器,所以必须写for
each row;

实操验证:

#触发器test5:
DELIMITER $$
CREATE TRIGGER test5
AFTER
UPDATE
ON goods
FOR EACH ROW
BEGIN
  INSERT INTO `ord` VALUES (1, 2, 2);
END$$

永利皇宫登录网址 1

 

mysql只扶助行级触发器,影响多少行就能够进行稍微次。

永利皇宫登录网址 2

for each row
每行受影响,触发器都实行,叫行级触发器。 oracle
触发器中分行级触发器和语句级触发器,可不写f…

一、简介
  触发器在数据Curry以单独的对象开展仓库储存,它与仓储进程和函数差别的是,存款和储蓄进度与函数要求用户展现调用才推行,而触发器是由二个事件来触发运营。oracle事件指的是对数据库的表或视图举办的insert、update及delete操作或对视图进行类似的操作。oracle将触发器的机能扩大到了触发ORACLE,如用户的记名、数据库的开发银行与关闭等。所以触发器常用来产生由数据库的完整性约束难以达成的复杂性工作规则的约束,或用来监视对数据库的种种操作,达成审计有关的成效。

触发器的咬合如下:

接触事件:在别的动静下触发trigger;如insert,update,delete

接触时间:该trigger是在接触事件产生此前(before)照旧之后(after)触发,也正是接触事件和该trigger的操作顺序。

触发器本身:该trigger被触发之后的施行体。举例PL/SQL块。

触发频率:表明触发器钦点义的动作被施行的次数。即语句级(statement)触发器和行级(row)触发器

  语句级(statement)触发器:指当触发事件产生时,该触发器只进行一回;

  行级(row)触发器:指当某触发事件时有发生时,对吸取该操作一下的每1行数据,触发器都单身实践。
oracle触发器分为如下三种:
一、DML触发器 DML 数据操纵语言(Data Manipulation Language)
  在DML语句(insert、update及delete)进行接触,能够在DML操作前或操作后展开接触,并且能够对每一种行或言辞操作上进展接触。
二、代替触发器
  由于在ORACLE里,不能够间接对由三个以上的表创设的视图进行操作。所以给出了代表触发器。它正是ORACLE
捌特意为拓展视图操作的1种管理办法。
三、系统触发器
  ORACLE 八i
提供了第三种等级次序的触发器叫系统触发器。它可以在ORACLE数据库系统的风云中开始展览接触,如ORACLE系统的起步与关闭等。

二、DML触发器

  oracle能够在dml语句进行接触,能够在dml操作前或操作后开展接触,并且能够对每一种行(行级)或讲话(级)操作上实行接触。DML触发器分为如下三种触发器:

  • 行触发器:是指为受到震慑的依次行激活的触发器,定义与话语触发器类似,有以下多个不相同: 

    1、定义语句中包括FO牧马人 EACH ROW子句。
    二、在BEFORE……FOBMWX三 EACH ROW触发器中,用户能够引用受到震慑的行值。

  • 说话触发器:是在表上或然有个别情状下的视图上实行的特定语句大概语句组上的触发器。能够与INSERT、UPDATE、DELETE或 者组合上进行关联。然则不论接纳什么的整合,各种语句触发器都只会针对钦命语句激活三次。无论update多少行,也只会调用二次update语句触发器。

  创制触发器的一般语法如下:

  create or replace trigger trigger_name
  {before|after}
  {insert|delete|update[of column]}
  on [schema] table_name
    [referencing {old[as] old|new[as]new|parent as parent}]
  [for each row]    
    [when condition]
  trigger body;

  以下person表结构如下:

DROP TABLE person ;
CREATE TABLE person (
id NUMBER(11) NOT NULL ,
username VARCHAR2(255 ) NULL ,
age NUMBER(11) NULL ,
password VARCHAR2(255) NULL ,
PRIMARY KEY (id)
)

  一、insert行级触发器

create or replace trigger trigger_insert
  before insert on person
 referencing new as new old as old
  for each row
declare
  v_username varchar2(50);
begin
  v_username := :new.username; 
  :new.age := :new.age + 2; --插入的年龄加2
  dbms_output.put_line(v_username); -- 插入插入记录的username字段
end trigger_insert; 
--添加数据
insert into person values (1, '张三', 20, 'zhangsan');

  2、update行级触发器

create or replace trigger trigger_update_before
  before update on person  
  referencing new as new old as old  
  for each row
declare
  v_username varchar2(50);
begin
  v_username := :new.username; -- 记录新名字
  :new.age := :new.age + 3; -- 修改年龄
  dbms_output.put_line(v_username);
end trigger_update_before;
-- after update 触发器
create or replace trigger trigger_update_after
  before update on person
  referencing new as new old as old
  for each row
declare
  v_old_name varchar2(50);
begin
  v_old_name :=  :old.username;  -- 记录修改前的名字
  dbms_output.put_line(v_old_name);   
end trigger_update_after;    
-- 更新数据
update person set username='张三1', age = 19 where id = 1;

  叁、delete行级触发器

create or replace trigger trigger_delete
  before delete on person
  referencing new as new old as old  
  for each row
declare
  v_old_name varchar2(50);
begin
  v_old_name :=  :old.username;  -- 获取被删除的用户名称
  dbms_output.put_line(v_old_name);
end trigger_delete;
--删除数据
delete from person where id = 1;

  肆、语句触发器

-- 记录操作表的信息
create table person_log(
  who varchar2(30),
  when date,
  action varchar2(50)
)
--触发器
create or replace trigger trigger_person_statment
  before insert or update or delete on person
declare
  -- 保存操作信息
  v_action person_log.action%type;
begin
  if inserting then
    v_action := 'Insert';
  elsif updating then
    v_action := 'Update';
  elsif deleting then
    v_action := 'Delete';
  else
   raise_application_error(-20001,'You should never ever get this error.');
  end if;
  insert into person_log(who,action,when)
  values(user, v_action,sysdate);
end trigger_person_statment;
-- 操作shuj
declare
begin  
   insert into person values(1003, '1342', 20, '234234');
   insert into person values(1004, '1342', 20, '234234');
   update person set age = 19 where id >1000 and id <1003;-- 此时触发器之后执行一次
   delete from person where id >1000 and id <1003;-- 此时触发器之后执行一次
end;   

  触发器触发次序

壹、执行BEFORE语句级触发器;
二、对与受语句影响的每一行
二.一、推行BEFORE行级触发器
2.2、执行DML语句
2.3、实行AFTEHaval行级触发器
三、施行AFTE奥迪Q五语句级触发器

 三、代替触发器

网站地图xml地图