我在mysql表上写了一个触发器。代码如下:
DELIMITER $$
CREATE TRIGGER update_on_product_option after update on db_name.table_name
FOR each row
BEGIN
if new.isactive <> old.isactive then
SET @inc=1;
-- update statement on some table here
else if new.lastupdatedts <> old.lastupdatedts then
-- update statement on some table here
set @t = 0;
end if;
end if;
END;
$$
DELIMITER ;
正如您所看到的那样,最后有两个end if
,令人惊讶的是,即使最后还有一个额外的end if;
,此触发器功能也不会产生任何错误。如果我删除一个end if
,则会抛出错误。无法理解为什么会这样。
答案 0 :(得分:1)
而不是ELSE IF,MySQL的语法使用ELSEIF(没有空格)。
https://dev.mysql.com/doc/refman/5.7/en/if.html
DELIMITER $$
CREATE TRIGGER update_on_product_option after update on db_name.table_name
FOR each row
BEGIN
if new.isactive <> old.isactive then
SET @inc=1;
-- update statement on some table here
elseif new.lastupdatedts <> old.lastupdatedts then
-- update statement on some table here
set @t = 0;
end if;
END;
$$
DELIMITER ;
虽然您可以通过添加额外的END IF使其与ELSE IF中的空间一起使用。通过使用空格,您可以有效地启动第二个IF语句,该语句必须独立于第一个外部IF语句而关闭。
答案 1 :(得分:0)
这是完全正常的(嵌套两个IF
标题,因此IF
必须关闭):
if new.isactive <> old.isactive then
SET @inc=1;
else if new.lastupdatedts <> old.lastupdatedts then
set @t = 0;
end if;
end if;
你可能想要:
if new.isactive <> old.isactive then
SET @inc=1;
elseif new.lastupdatedts <> old.lastupdatedts then
SET @t = 0;
end if;
区别在于ELSE IF
与ELSEIF
。
答案 2 :(得分:0)
使用elseif(没有空格)而不是if。 reasion是当你使用else时,如果有空间,则考虑使用其他用于启动if和你创建新条件if if so它需要关闭end if。所以在你的查询中需要两个结束if。
DELIMITER $$在db_name.table_name上更新后创建TRIGGER update_on_product_option FOR每行BEGIN如果new.isactive&lt;&gt; old.isactive然后SET @ inc = 1; - 如果是new.lastupdatedts&lt;&gt;,请在某些表格上更新声明。 old.lastupdatedts然后 - 在某些表上更新语句设置@t = 0;万一;结束; $$ DELIMITER;