有如下三个表:
A(id,num),
B(id,price),
C(id,ttl);
逻辑关系非常简单:ttl=num*price.  if a.id=b.id=c.id
有一个小需求:
B中的price改变,方式可能多种多样,不妨认为是人工输入改变.要求同步C表的数据。
mysql trigger 是不能返回结果集的,请大家帮忙看看这个问题应该如何解决。

解决方案 »

  1.   

    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
      

  2.   

    你可以把1楼大神下边边的SQL加上条件写进触发器
      

  3.   

    不好意思,我不大明白你的意思:
    delimiter //
    create trigger tri_b_upd_af after update on b for each row
    update c set ttl=new.price*num   -- (这个num按我的理解,是获取不到的)
    end//把连接写到触发器中?比如,我们在前台改变了一下价格,如果是用连接方式,我们就得利用事务,把这一个逻辑封装。但是连接显然是牵扯的面太广,不是一个很理想的方式.
      

  4.   

    我的意思是,例如 
    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值不对么,不太明白你的意思
      

  5.   

    上边的错了  -->  
    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
      

  6.   

    后边你也可以加条件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; 
      

  7.   

    用不着触发器。
    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;
      

  8.   

    建议在ID上建立索引,用连接进行替换,
    用TRIGGER思路是一样的orCREATE 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
      

  9.   

    应该是不行的吧,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)
      

  10.   

    仔细看看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
    否则用连接替换
      

  11.   

    多谢各位.WWWWA的解答给我帮助较大,再次多谢。