如果触发器中为null,则设置变量

int*_*_32 2 mysql sql triggers

我有一个类别表,其中"订单"列用于订购类别.我试图在插入之前在触发器中逐步设置顺序:

CREATE TRIGGER `categories_set_order` BEFORE INSERT ON `categories` FOR EACH ROW BEGIN
    DECLARE max_order INT DEFAULT 0;
    SELECT MAX(categories.order) INTO max_order FROM categories;
    SET NEW.order = max_order + 1;
END;
Run Code Online (Sandbox Code Playgroud)

但是如果db中没有记录,则将order列设置为NULL.我修改了触发器代码:

CREATE TRIGGER `categories_set_order` BEFORE INSERT ON `categories` FOR EACH ROW BEGIN
    DECLARE max_order INT DEFAULT 0;
    SELECT MAX(categories.order) INTO max_order FROM categories;
    IF (ISNULL(@max_order)) THEN BEGIN
        SET max_order = 0;
    END;

    SET NEW.order = max_order + 1;
END;

And I'm getting the following error:
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 9
Run Code Online (Sandbox Code Playgroud)

第9行是:

如果(ISNULL(@max_order))那么开始

我试图删除"@",但仍然得到相同的错误.怎么解决?

jue*_*n d 6

您需要更改分隔符.否则,DB认为您的触发器定义在第一个结束时结束,;这将是不完整的.

同时BEGIN从您的IF语句中删除并添加用于END IF结束您的语句IF

delimiter |
CREATE TRIGGER `categories_set_order` BEFORE INSERT ON `categories` 
FOR EACH ROW BEGIN
    DECLARE max_order INT DEFAULT 0;
    SELECT MAX(categories.order) INTO max_order FROM categories;
    IF (ISNULL(@max_order)) THEN
        SET max_order = 0;
    END IF;

    SET NEW.order = max_order + 1;
END
|
delimiter ;