mysql触发器中的语法

时间:2015-12-19 11:20:16

标签: mysql triggers

我在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,则会抛出错误。无法理解为什么会这样。

3 个答案:

答案 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 IFELSEIF

答案 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;