菜鸟求助,关于mysql trigger的一个问题

thomasLand 2012-12-04 03:04:58
有如下三个表:
A(id,num),
B(id,price),
C(id,ttl);
逻辑关系非常简单:ttl=num*price. if a.id=b.id=c.id
有一个小需求:
B中的price改变,方式可能多种多样,不妨认为是人工输入改变.要求同步C表的数据。
mysql trigger 是不能返回结果集的,请大家帮忙看看这个问题应该如何解决。
...全文
144 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
thomasLand 2012-12-04
  • 打赏
  • 举报
回复
多谢各位.WWWWA的解答给我帮助较大,再次多谢。
mysdzlt2007 2012-12-04
  • 打赏
  • 举报
回复
你没有连接,却要使用a.num。。。
WWWWA 2012-12-04
  • 打赏
  • 举报
回复
仔细看看9楼的代码 CREATE TRIGGER `updat` AFTER UPDATE ON `b` FOR EACH ROW BEGIN IF NEW.price<>OLD.price THEN select num into @num from a where a.id=old.id; update c set c.ttl=@num*NEW.price where id=old.id; END IF; END 否则用连接替换
thomasLand 2012-12-04
  • 打赏
  • 举报
回复
应该是不行的吧,unknown colum 'a.num' .... mysql> create trigger tri_b_aft_upd after update on b for each row -> update c set c.ttl=new.price*a.num where c.id=new.id; -> // Query OK, 0 rows affected (0.01 sec) mysql> update b set price=1.5 where id=1; -> // ERROR 1054 (42S22): Unknown column 'a.num' in 'field list' mysql> desc a; -> // +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | num | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.39 sec)
WWWWA 2012-12-04
  • 打赏
  • 举报
回复
建议在ID上建立索引,用连接进行替换, 用TRIGGER思路是一样的 or CREATE TRIGGER `updat` AFTER UPDATE ON `b` FOR EACH ROW BEGIN IF NEW.price<>OLD.price THEN select num into @num from a where a.id=old.id; update c set c.ttl=@num*NEW.price where id=old.id; END IF; END
Rotel-刘志东 2012-12-04
  • 打赏
  • 举报
回复
用不着触发器。 update c inner join b on c.id=b.id inner join a on a.id=c.id set c.ttl=a.num*b.price;
mysdzlt2007 2012-12-04
  • 打赏
  • 举报
回复
后边你也可以加条件update c inner join b on c.id=b.id inner join a on a.id=c.id set c.ttl=a.num*b.price WHERE c.id=NEW.id;
mysdzlt2007 2012-12-04
  • 打赏
  • 举报
回复
上边的错了 --> CREATE TRIGGER `updat` AFTER UPDATE ON `b` FOR EACH ROW BEGIN IF NEW.price<>OLD.price THEN update c inner join b on c.id=b.id inner join a on a.id=c.id set c.ttl=a.num*b.price ; END IF; END
mysdzlt2007 2012-12-04
  • 打赏
  • 举报
回复
我的意思是,例如 CREATE TRIGGER `updat` AFTER UPDATE ON `c` FOR EACH ROW BEGIN IF NEW.b_sid<>OLD.b_sid THEN update c inner join b on c.id=b.id inner join a on a.id=c.id set c.ttl=a.num*b.price ; END IF; END 这样连接出来的num值不对么,不太明白你的意思
thomasLand 2012-12-04
  • 打赏
  • 举报
回复
不好意思,我不大明白你的意思: delimiter // create trigger tri_b_upd_af after update on b for each row update c set ttl=new.price*num -- (这个num按我的理解,是获取不到的) end// 把连接写到触发器中?比如,我们在前台改变了一下价格,如果是用连接方式,我们就得利用事务,把这一个逻辑封装。但是连接显然是牵扯的面太广,不是一个很理想的方式.
mysdzlt2007 2012-12-04
  • 打赏
  • 举报
回复
引用 2 楼 thomasks 的回复:
这个表结构只是一个说法,并不是具体的。考虑到数据量的问题,这样做开销不能忍受。多谢。用触发器不可行?
你可以把1楼大神下边边的SQL加上条件写进触发器
thomasLand 2012-12-04
  • 打赏
  • 举报
回复
这个表结构只是一个说法,并不是具体的。考虑到数据量的问题,这样做开销不能忍受。多谢。用触发器不可行?
WWWWA 2012-12-04
  • 打赏
  • 举报
回复
update c inner join b on c.id=b.id inner join a on a.id=c.id set c.ttl=a.num*new.price 直接替换不行? update c inner join b on c.id=b.id inner join a on a.id=c.id set c.ttl=a.num*b.price

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧