触发器创建哪里有错误啊,求大神指点

wakelay 发布于 2013/08/27 20:32
阅读 640
收藏 0

CREATE TRIGGER ch_file 

 AFTER UPDATE ON folder

 FOR EACH ROW 

 AS BEGIN 

   UPDATE folder SET share = NEW.share WHERE in_folder = NEW.id; 

   UPDATE file SET share = NEW.share where in_folder=NEW.id; 

END;

这是触发器的代码 执行创建显示错误如下

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
ERROR 1054 (42S22): Unknown column 'NEW.id' in 'where clause'
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END' at line 1

mysql版本是5.1.69  
加载中
0
八宝旗
八宝旗


1、"FOR EACH ROW AS BEGIN"多了 'AS'

2、"UPDATE folder SET share = NEW.share WHERE in_folder = NEW.id; "

触发器中对原表进行update,会导致原表执行update操作执行错误

Error Code : 1442
Can't update table 'xxx' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.


0
李察德-泰森
李察德-泰森
ERROR 1054 (42S22): Unknown column 'NEW.id' in 'where clause'
w
wakelay
是new.id这种写法不对吗?数据库表里有id的啊。。
0
redzl
redzl
你的 folder表没有ID这个字段,检查一下吧
w
wakelay
有id这个字段啊。。
0
李察德-泰森
李察德-泰森
mysql我没用过,我只是估计是你在触发器里更新的时候,你的原意是根据新的Id来更新,但是这种写法估计有问题,不应该用NEW.Id来获取,而是其它什么
w
wakelay
那该如何获取变更的记录的内容呢?
0
g
goddagekeky
没用过mysql,不过oracle中,应该这样写:new.id,前面要加一个冒号,不知道mysql是不是一样,而且,既然是 AFTER UPDATE ON folder触发,为什么还要再写一次update folder
0
w
wakelay

引用来自“goddagekeky”的答案

没用过mysql,不过oracle中,应该这样写:new.id,前面要加一个冒号,不知道mysql是不是一样,而且,既然是 AFTER UPDATE ON folder触发,为什么还要再写一次update folder
试了下还是不行,我是参考着mysql 中文参考手册写的,这个是手册上的例子:
CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;  
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END
0
名字不能超过十个字
名字不能超过十个字
貌似 mysql中不允许在触发器中对创建触发器的表进行操作, 以免递归触发
0
g
goddagekeky

引用来自“wakelay”的答案

引用来自“goddagekeky”的答案

没用过mysql,不过oracle中,应该这样写:new.id,前面要加一个冒号,不知道mysql是不是一样,而且,既然是 AFTER UPDATE ON folder触发,为什么还要再写一次update folder
试了下还是不行,我是参考着mysql 中文参考手册写的,这个是手册上的例子:
CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;  
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END

我是这样理解的,不知道对不对,BEFORE INSERT ON test1因为是插入一条新数据,所以可以拿到new.a1,但是update一条数据时,如果a1字段值不变,我不知道这个a1还算不算new

0
g
goddagekeky

引用来自“wakelay”的答案

引用来自“goddagekeky”的答案

没用过mysql,不过oracle中,应该这样写:new.id,前面要加一个冒号,不知道mysql是不是一样,而且,既然是 AFTER UPDATE ON folder触发,为什么还要再写一次update folder
试了下还是不行,我是参考着mysql 中文参考手册写的,这个是手册上的例子:
CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;  
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END
而且,在after update on 某个表之后,还对这个表进行操作,总感觉很奇怪
返回顶部
顶部