mysql - 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
(从法语翻译)。
我尝试了各种语法,但所有接缝都不起作用,而且我也知道我的更改与更改双引号、删除BEGIN
with END IF;
... 非常相似,所以我知道这些转折是不敬的。
我在许多互联网资源和官方文档中修改了语法,没有任何帮助。
解决方案
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 ;
推荐阅读
- php - SQLite PDO - Data not inserted to database
- angular - 通过 GitHub 页面托管 Angular 应用程序时出错
- ios - iOS UIWebView - caching assets in native apap
- python - My dataframe returns 0 rows, yet when I use filters on excel spreadsheet the rows are displayed
- ios - 在图表的 PieChartView 中格式化自定义图例条目?
- akka.net - Why is the Akka.Serialization.Hyperion serialization package still in beta?
- algolia - Algolia - Places autocomplete using php api client
- php - 如何在php中进行记录的内部循环
- python - Is there a way to set variables at runtime in python
- mysql - sql多表查询