MySQL - 这个触发器有什么问题?

时间:2013-11-21 14:20:03

标签: mysql triggers

我正在尝试创建此触发器,并且UPDATE行出现错误。

DROP TRIGGER IF EXISTS upd_signedup;

CREATE TRIGGER upd_signedup
BEFORE INSERT ON tbl_users
FOR EACH ROW
BEGIN
  UPDATE tbl_user_stats SET signups = signups + 1;
END

编辑:我已将分隔符设置为$$但无法创建此触发器:

 drop trigger if exists upd_signedup$$

 CREATE TRIGGER upd_signedup
 BEFORE INSERT ON tbl_users
 FOR EACH ROW
 BEGIN
  UPDATE tbl_user_stats SET signups = signups + 1$$
 END

2 个答案:

答案 0 :(得分:2)

似乎你误解了在定义触发器时使用DELIMITER的概念。

;(分号)是常规分隔符,是可执行语句结束的指示符。 但是,在定义触发器或存储过程时,可以使用多个可执行语句(如变量声明和SQL语句)定义主体。

使用;表示语句到达结束的SQL引擎,是时候编译和执行它了。但除非触发器或存储过程的主体 END ,否则执行trigger / sp body的内部语句没有意义。要停止处理此类语句,我们使用自定义DELIMITER,例如//$$或您喜欢的内容,并且经常不在trigger / sp定义的正文部分中使用。然后,MySQL会理解语句只有在找到自定义DELIMITER $$//时才会结束。

示例如下所示:

mysql>
mysql> set @cnt=0;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> -- drop trigger if exists trig_bef_del_on_tbl;
mysql> delimiter //
mysql> create trigger trig_bef_del_on_tbl before delete on tbl
    ->   for each row begin
    ->     set @cnt = if(@cnt is null, 1, (@cnt+1));
    ->
    ->     /* for cross checking save loop count */
    ->     insert into rows_affected values ( @cnt );
    ->   end;
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> delimiter ;
mysql>
mysql> -- now let us test the delete operation
mysql> delete from tbl where i like '%1%';
Query OK, 3 rows affected (0.02 sec)

请参阅

答案 1 :(得分:0)

触发器的主体只有一个命令,所以你可以使用这个简单的语法,没有BEGIN-END子句而没有DELIMITER:

CREATE TRIGGER upd_signedup
  BEFORE INSERT ON tbl_users
  FOR EACH ROW
  UPDATE tbl_user_stats SET signups = signups + 1;