数据库触发器:当指定的条件满足时,触发器中的代码自动执行。
有朋友问了个问题,概括下来场景如下:
两个表a、b,a表中插入数据或者更新数据时,会从b表检索记录,找到匹配的记录后,用b表的某个字段更新a表的相应字段。
oracle版
/*
触发器位于test1表,test1插入数据时,从test2中查找数据更新test1
例子中是向test1插入c1='c',查找test2中的c2,最终插入test1的数据变为c1='c',c2='cc'
*/
-- 测试数据
create table test1(c1 varchar2(100),c2 varchar2(100),c3 varchar2(100))
create table test2(c1 varchar2(100),c2 varchar2(100),c3 varchar2(100))
insert into test2 (c1,c2,c3) values('c','cc','ccc');
insert into test2 (c1,c2,c3) values('y','yy','yyy');
insert into test2 (c1,c2,c3) values('h','hh','hhh');
commit;
-- 触发器
create or replace trigger test1_tri_1 -- 命名
before insert or update -- 触发时机及触发事件
on test1 -- 在test1触发
for each row -- 行级触发器
declare
str varchar2(100); -- 声明变量
-- pragma autonomous_transaction;
begin
select c2 into str from test2 where c1=:new.c1; -- 从test2表获取c2字段值
-- dbms_output.put_line(str);
:new.c2:=str; -- 更新触发器游标值,之后会被插入或更新到 test1表c2字段中
end;
-- 测试
set serveroutput on
insert into test1 (c1) values('c');
commit;
-- 查询验证
select * from test1
mysql版
mysql貌似不支持oracle那种写法故拆开写了两个,如果有朋友懂得写成一个的方法,可以评论告诉我。
insert
/*
触发器位于test1表,test1插入数据时,从test2中查找数据更新test1
例子中是向test1插入c1='c',查找test2中的c2,最终插入test1的数据变为c1='c',c2='cc'
*/
-- 测试数据
create table test1(c1 varchar(100),c2 varchar(100),c3 varchar(100));
create table test2(c1 varchar(100),c2 varchar(100),c3 varchar(100));
insert into test2 (c1,c2,c3) values('c','cc','ccc');
insert into test2 (c1,c2,c3) values('y','yy','yyy');
insert into test2 (c1,c2,c3) values('h','hh','hhh');
commit;
-- 触发器
create trigger test1_tri_1
before insert
on test1
for each row
set new.c2=(select c2 from test2 where c1=new.c1);
-- 测试
insert into test1 (c1) values('c');
commit;
-- 查询验证
select * from test1
update
-- 触发器
create trigger test1_tri_2
before update
on test1
for each row
set new.c3=(select c3 from test2 where c1=new.c1);
-- 测试
update test1 set c1=’c’;
commit;
-- 查询验证
select * from test1