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
解决方案 »
- 如何查询一个表格的数据并对其总条件进行汇总
- 存储过程不存在?!(PROCEDURE does not exist)
- MYI比MYD大?
- 遍历游标的时候,不能执行动态sql(prepate stmt from @v_Sql)吗?
- 如何删除这样的行?
- 数据库中英主席截取的问题!
- 在mysql的c接口中怎样把变量值的insert数据库中?
- 搞错了分数,select substring(sendtime,1,8) ,count(*) from (select sendtime c from hasms_mo) group by substring(sendtime,1,8) ;为
- 如何在MySQL某一字段中查找并替换掉其中给定的字符串。
- 关于“Specified key was too long; max key length is 1000 bytes“问题的解决办法
- mysql 查询50W条记录的表,怎么优化
- not exists 这样的怎么写
select a.age from a inner join b on b.id=a.id
set new.age = v_age;
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>
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 ;
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 不能用子查询
TRIGGER 中不能再对本表进行update/insert/delete操作。 所以1楼,4楼方法均会遇到这个限制。
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;
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
触发器能建立,果然是目前不允许
版主这个new是从哪来的呢?
select age into v_age from a where id=new.id;中,new也不是谁的别命啊!
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扩展。
确实不能啊,我试验了一下: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;
$$
不过想想应该不能这样,如此的话会造成我这个触发器永远无休止地往里插入内容!