当前位置: 代码迷 >> PHP >> 怎么做两个表之间的触发器
  详细解决方案

怎么做两个表之间的触发器

热度:7   发布时间:2016-04-29 00:40:34.0
如何做两个表之间的触发器?
学生表:学号,姓名,年龄,系号,系名
系表:系号,系名,姓名,年龄。

如何在学生表中增加一条记录,系表中也随之自动增加。同理,删除怎么做?

------解决方案--------------------
当然可以!
你可以仿照这篇博文进行 http://www.cnblogs.com/nicholas_f/archive/2009/09/22/1572050.html

希望成功后能共享出你的成果
------解决方案--------------------
我没有做过,所以才让你去看人家的做的例子
要是让你看手册,不就太那个了吗
------解决方案--------------------
delimiter //
DROP TRIGGER IF EXISTS trigger_on_tab1//
CREATE TRIGGER trigger_on_tab1
AFTER INSERT ON test1 
FOR EACH ROW 
BEGIN
insert into test2(test1_id,test1_name) values(new.id, new.name); 
END//

一个列子,可以借鉴下哦!
------解决方案--------------------
语法错了。贴出你的SQL串看看。
------解决方案--------------------
语句没错,应该是分界符的问题。
执行该触发器之前先将分节符;修改下再执行创建
delimiter $
drop trigger if exists t_afterinsert_on_tab1$
create trigger t_afterinsert_on_tab1
after insert on TAB1
for each row
begin
insert into tab2(tab2_name) values (new.tab1_name);
end$
insert into tab1 (tab1_name) values ('张三')$
这段代码试下看
------解决方案--------------------
SQL code
以eschop的商品表,跟订单表为例:新建商品表create table goods(    id int auto_increment primary key, #商品id    name varchar(30) not null default '',#商品名    num tinyint not null default 0    #商品数量)engine  myisam default charset utf8;新建订单变create table indent(    oid int auto_increment primary key,    #订单id    gid int not null default 0,    #商品id    much tinyint not null default 0    #购买数量)engine myisam default charset utf8;mysql> desc goods;+-------+-------------+------+-----+---------+----------------+| Field | Type        | Null | Key | Default | Extra          |+-------+-------------+------+-----+---------+----------------+| id    | int(11)     | NO   | PRI | NULL    | auto_increment || name  | varchar(30) | NO   |     |         |                || num   | tinyint(4)  | NO   |     | 0       |                |+-------+-------------+------+-----+---------+----------------+3 rows in setmysql> desc indent;+-------+------------+------+-----+---------+----------------+| Field | Type       | Null | Key | Default | Extra          |+-------+------------+------+-----+---------+----------------+| oid   | int(11)    | NO   | PRI | NULL    | auto_increment || gid   | int(11)    | NO   |     | 0       |                || much  | tinyint(4) | NO   |     | 0       |                |+-------+------------+------+-----+---------+----------------+插入演示数据:insert into goods values(1,'三星手机',12),(2,'ipad电脑',19),(3,'摩托罗拉mp3',38);mysql> select * from goods;+----+-------------+-----+| id | name        | num |+----+-------------+-----+|  1 | 三星手机    |  12 ||  2 | ipad电脑    |  19 ||  3 | 摩托罗拉mp3 |  38 |+----+-------------+-----+手工给订单表添加购买记录:insert into indent(gid,much)values(3,2);mysql> select * from indent;+-----+-----+------+| oid | gid | much |+-----+-----+------+|   1 |   3 |    2 |+-----+-----+------+1 row in set手工给商品表减少商品信息:update goods set num=num-2 where id=3;mysql> select * from goods;+----+-------------+-----+| id | name        | num |+----+-------------+-----+|  1 | 三星手机    |  12 ||  2 | ipad电脑    |  19 ||  3 | 摩托罗拉mp3 |  36 |+----+-------------+-----+3 rows in set修改mysql的结束符:mysql> delimiter $-------------------------------------------创建触发器create trigger tg1after insert  #在插入之后触发on indentfor each row  #固定写法beginupdate goods set num=num-1 where id=3;end$------------------------------------------模拟用户下订单流程商品表:+----+-------------+-----+| id | name        | num |+----+-------------+-----+|  1 | 三星手机    |  12 ||  2 | ipad电脑    |  19 ||  3 | 摩托罗拉mp3 |  36 |+----+-------------+-----+订单表:+-----+-----+------+| oid | gid | much |+-----+-----+------+|   1 |   3 |    2 |+-----+-----+------+①下订单insert into indent(gid,much)values(2,4)$②查看订单表+-----+-----+------+| oid | gid | much |+-----+-----+------+|   1 |   3 |    2 ||   2 |   2 |    4 |+-----+-----+------+③商品表应该减少+----+-------------+-----+| id | name        | num |+----+-------------+-----+|  1 | 三星手机    |  12 ||  2 | ipad电脑    |  19 ||  3 | 摩托罗拉mp3 |  35 |+----+-------------+-----+结论:显然用户下了2号订单,下了4件商品,订单生成了!商品却没减少,还出现了错误!-----------------------------------------正确的创建触发器:create trigger tg2after inserton indentfor each rowbeginupdate goods set num=num-new.much where id=new.gid;end$-----------------------------------下订单insert触发器-----------------------------------------出现错误:因为一张表不能同时被2个触发器监视,所以要删除开始创建的触发器mysql> drop  tg1$Query OK, 0 rows affectedmysql> show triggers$Empty set开始购买商品(清空订单表):mysql> select * from goods;    -> $+----+-------------+-----+| id | name        | num |+----+-------------+-----+|  1 | 三星手机    |  12 ||  2 | ipad电脑    |  19 ||  3 | 摩托罗拉mp3 |  35 |+----+-------------+-----+3 rows in setmysql> insert into indent(gid,much)values(2,4)$Query OK, 1 row affectedmysql> select * from indent$    #下订单成功+-----+-----+------+| oid | gid | much |+-----+-----+------+|   1 |   2 |    4 |+-----+-----+------+1 row in setmysql> select * from goods$    #对应商品自动减少OK+----+-------------+-----+| id | name        | num |+----+-------------+-----+|  1 | 三星手机    |  12 ||  2 | ipad电脑    |  15 ||  3 | 摩托罗拉mp3 |  35 |+----+-------------+-----+3 rows in set------------------------------------------取消订单delete触发器------------------------------------create trigger tg3after deleteon indentfor each rowbeginupdate goods set num=num+old.much where id=old.gid;end$注:真项目中,永远不会物理删除订单----------------------------------模拟取消订单:mysql> select * from goods$+----+-------------+-----+| id | name        | num |+----+-------------+-----+|  1 | 三星手机    |  12 ||  2 | ipad电脑    |  15 ||  3 | 摩托罗拉mp3 |  35 |+----+-------------+-----+3 rows in setmysql> select * from indent$+-----+-----+------+| oid | gid | much |+-----+-----+------+|   1 |   2 |    4 |+-----+-----+------+1 row in setmysql> delete from indent where oid=1$Query OK, 1 row affectedmysql> select * from indent$Empty setmysql> select * from goods$+----+-------------+-----+| id | name        | num |+----+-------------+-----+|  1 | 三星手机    |  12 ||  2 | ipad电脑    |  19 ||  3 | 摩托罗拉mp3 |  35 |+----+-------------+-----+3 rows in set------------------------------------修改订单update触发器-----------------------------------------修改订单公式:update goods set num=num+old.much-new.much where id=old.gid;关键部分:新数量等=本身数量+被修改的旧数量-新产生的数量(完全数学逻辑),id不变create trigger tg4after updateon indentfor each rowbeginupdate goods set num=num+old.much-new.much where id=old.gid;end$-------------------------mysql> select  * from goods$+----+-------------+-----+| id | name        | num |+----+-------------+-----+|  1 | 三星手机    |   7 ||  2 | ipad电脑    |  19 ||  3 | 摩托罗拉mp3 |  35 |+----+-------------+-----+3 rows in setmysql> select  * from indent$+-----+-----+------+| oid | gid | much |+-----+-----+------+|   2 |   1 |    5 |+-----+-----+------+1 row in setmysql> update indent set much=10 where oid=2$Query OK, 1 row affectedRows matched: 1  Changed: 1  Warnings: 0mysql> select  * from goods$+----+-------------+-----+| id | name        | num |+----+-------------+-----+|  1 | 三星手机    |   2 ||  2 | ipad电脑    |  19 ||  3 | 摩托罗拉mp3 |  35 |+----+-------------+-----+3 rows in setmysql> select  * from indent$+-----+-----+------+| oid | gid | much |+-----+-----+------+|   2 |   1 |   10 |+-----+-----+------+1 row in set-------------------------------------------触发器基础完成!快速清空表:truncate [表名]修改mysql的结束符:delimiter $;显示触发器:show triggers删除触发器:drop trigger [触发器名称]创建触发器:create trigger [触发器名称]after [触发行为/insert/update/delete]on [监视对象/某张表]for each row #固定写法begin    sql语句;end$注意:一个触发器只能对应某张表的某一个行为!不能多个触发器来监视某一张表的同一个行为!
  相关解决方案