2014-01-18 44 views
2

我有一个用于排序类别的“订单”列的类别表。 我想在触发之前插入递增设置顺序:如果在触发器中为空,则设置变量

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; 

但是如果在数据库中没有记录,订单列被设置为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 

线9:

IF(ISNULL(@max_order))然后开始

我试着删除 “@”,但仍然得到相同的错误。如何解决它?

回答

6

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

而且从IF语句删除BEGIN并添加使用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 ; 
2

除了分隔符,你需要一个END 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 ; 
相关问题