首页 > 解决方案 > MySQL 错误代码 #1064 在插入前创建触发器时靠近 IF ELSE 块

问题描述

我正在尝试对必须维护的数据库施加generic_asset.type = 'raw'约束。generic_asset.atomic = 1为此,我编写了以下类型的触发器BEFORE INSERT。这是片段:

DELIMITER //

CREATE TRIGGER generic_asset_check BEFORE INSERT ON generic_asset FOR EACH ROW
BEGIN
   IF NEW.type = 'raw' THEN
   BEGIN
       IF NEW.atomic = 0 THEN
           SET SQLSTATE = 'Sorry cannot insert';
       END IF;
   END IF;
END //


DELIMITER ;

错误是这样的:

#1064 - syntax error near 'SQLSTATE = 'Sorry cannot insert';
       END IF;
   END IF;
END' in line 6

(从法语翻译)。

我尝试了各种语法,但所有接缝都不起作用,而且我也知道我的更改与更改双引号、删除BEGINwith END IF;... 非常相似,所以我知道这些转折是不敬的。

我在许多互联网资源和官方文档中修改了语法,没有任何帮助。

标签: mysqlsqlif-statementtriggerssql-insert

解决方案


MySQL 的IF语句不带BEGIN关键字。此外,如果您想从触发器中引发错误,您需要SIGNAL. 最后,这两个嵌套条件可以展平。

考虑:

DELIMITER //
CREATE TRIGGER generic_asset_check BEFORE INSERT ON generic_asset FOR EACH ROW
BEGIN
   IF NEW.type = 'raw' AND NEW.atomic = 0 THEN
       SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Sorry cannot insert';
   END IF;
END //
DELIMITER ;

DB Fiddle 上的演示


推荐阅读