繁体   English   中英

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

[英]MySQL - What is wrong with this trigger?

我正在尝试创建此触发器,并且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

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

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

使用; 表示语句到达结束的SQL引擎,是时候编译并执行它了。 s, there is no meaning in executing internal statements of trigger/sp body. 但除非触发器或存储过程的主体是 ,否则执行trigger / sp体的内部语句没有任何意义。 要停止处理这样的语句,我们使用自定义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)

参考

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM