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