mysql 下创建一个触发器的问题

hutuyang 发布于 2013/04/11 17:09
阅读 337
收藏 0

数据库存在使用如下语句创建的一个数据表:

create table tb_name (t_id int,  t_name  varchar(20));

请创建一个触发器,实现无论用户向表中添加什么数据字段,t_name 的内容都是"HelloWorld".

我的mysql语句如下:

CREATE TRIGGER ins_su BEFORE INSERT ON tb_name  FOR EACH ROW INSERT INTO tb_name SET t_name = "HelloWorld";

但是在向t_id 插入一个数据时:

INSERT INTO tb_name (t_id) VALUES (1);

报出如下错误:

Can't update table 'tb_name' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

不是太明白错误原因,不知道正确的语句如何写?麻烦哪位高手解释一下

加载中
0
jwjiang
jwjiang

你在INSERT的触发器里又执行一个INSERT,那这个INSERT又会触发触发器,所以就死循环了,这样不行。

另外mysql中,如果一个表在触发器中是不能改变这个表的状态的

要改变插入的值,你只要写new.t_name= "HelloWorld" 就行了

八宝旗
八宝旗
正解
hutuyang
hutuyang
我把创建触发器的那句改成这个: CREATE TRIGGER ins BEFORE INSERT ON tb_name FOR EACH ROW SET NEW.t_name = "helloworld";
0
StormFour
StormFour

这个用一个默认值default就行了,何必要用触发器

0
张亦俊
张亦俊

我来解释一下原因吧,但是因为不熟悉MySQL,只能等楼下高人解觉。

简单来说,这句CREATE TRIGGER会有循环触发的问题,你在每一个INSERT之前触发了一个INSERT,而触发的这个INSERT同样可以触发INSERT,这样就会不断循环了(我觉得是这样)。

修改建议的话,在INSERT完成之后触发一个UPDATE把t_name变成"HelloWorld",但怎么用MySQL写,还是要等高人。

0
奇葩100
奇葩100
这个问题很典型。建议好好理解,这是开始进阶了。
返回顶部
顶部