create table a(id int, name varchar(6), age int);
create table b(rid int, id int, age int);
以上是两个表,我想用一个触发器,实现当
insert into b(rid, id) (5, 2);后
给b(age)添加一个值,该值的内容是b.id=a.id时a表中对应的age

解决方案 »

  1.   

    insert into b
    select a.age from a inner join b on b.id=a.id
      

  2.   

    你可以在触发器中 试一下。select age into v_age from a where id=new.id;
    set new.age = v_age;
      

  3.   

    mysql> delimiter |
    mysql>
    mysql> CREATE TRIGGER tr_netxuning_bi BEFORE INSERT ON b
        ->   FOR EACH ROW BEGIN
        ->          declare v_age int;
        ->          select age into v_age from a where id=new.id;
        ->     set new.age = v_age;
        ->   END;
        -> |
    Query OK, 0 rows affected (0.14 sec)mysql>
    mysql> delimiter ;
    mysql> select * from a;
    +------+------+------+
    | id   | name | age  |
    +------+------+------+
    |    1 | A1   |   10 |
    |    2 | A2   |   20 |
    +------+------+------+
    2 rows in set (0.00 sec)mysql> insert into b(rid, id) values (5, 2);
    Query OK, 1 row affected (0.30 sec)mysql> select * from b;
    +------+------+------+
    | rid  | id   | age  |
    +------+------+------+
    |    5 |    2 |   20 |
    +------+------+------+
    1 row in set (0.00 sec)mysql>
      

  4.   

    delimiter $$
    CREATE TRIGGER t_tb1_ai AFTER INSERT ON b
    FOR EACH ROW BEGIN
        update b set age=(select age from a where b.id=a.id);
    END;
    $$
    delimiter ;
       
      

  5.   

    mysql> insert into b(rid,id) values(5,2);
    ERROR 1442 (HY000): Can't update table 'b' in stored function/trigger because it
     is already used by statement which invoked this stored function/trigger.
    triger 不能用子查询
      

  6.   


    TRIGGER 中不能再对本表进行update/insert/delete操作。 所以1楼,4楼方法均会遇到这个限制。
      

  7.   

    CREATE TRIGGER tr_test 
    AFTER INSERT ON b 
    FOR EACH ROW 
    BEGIN 
    DECLARE v_age int;
    SELECT age FROM a WHERE id=new.id INTO v_age;
    UPDATE b set age=v_age where id=new.id;
    END;
      

  8.   


    Error 2009-9-14 10:19:22 0:00:00.000 MySQL Database Error: Can't update table 'b' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 6 0
    触发器能建立,果然是目前不允许
      

  9.   


    版主这个new是从哪来的呢?
    select age into v_age from a where id=new.id;中,new也不是谁的别命啊!
      

  10.   

    NEW/OLD 这个倒是在大部分数据中都有说明。============================================================21.1. CREATE TRIGGER语法CREATE TRIGGER trigger_name trigger_time trigger_event
        ON tbl_name FOR EACH ROW trigger_stmttrigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:·         INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
    ·         UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
    ·         DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。使用别名OLD和NEW,能够引用与触发程序相关的表中的列。OLD.col_name在更新或删除它之前,引用已有行中的1列。NEW.col_name在更新它之后引用将要插入的新行的1列或已有行的1列。激活触发程序时,对于触发程序引用的所有OLD和NEW列,需要具有SELECT权限,对于作为SET赋值目标的所有NEW列,需要具有UPDATE权限。使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。用OLD命名的列是只读的。你可以引用它,但不能更改它。对于用NEW命名的列,如果具有SELECT权限,可引用它。在BEFORE触发程序中,如果你具有UPDATE权限,可使用“SET NEW.col_name = value”更改它的值。这意味着,你可以使用触发程序来更改将要插入到新行中的值,或用于更新行的值。在BEFORE触发程序中,AUTO_INCREMENT列的NEW值为0,不是实际插入新记录时将自动生成的序列号。OLD和NEW是对触发程序的MySQL扩展。
      

  11.   


    确实不能啊,我试验了一下:delimiter $$
    create trigger ins_a
    after insert on a
    for each row begin
    insert into a(id, name, age) values(new.id + 1, new.name, new.age + 1);
    end;
    $$
    不过想想应该不能这样,如此的话会造成我这个触发器永远无休止地往里插入内容!