mysql - 使用 MariaDB/MySQL 继续获得 1064
问题描述
我正在努力让下面的触发器与我的数据库一起编译。现在它的 MariaDB v5.5.56。我在在线验证器中尝试过这种语法,结果如下:
SQLFiddle:
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 4
https://www.eversql.com/sql-syntax-check-validator/
Great work, the query's syntax is valid!
https://rextester.com/l/mysql_online_compiler
Compiles with no errors
在我的环境中,我得到:
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 4.
我的错误似乎与 SQLFiddle 错误相匹配……但奇怪的是,其他解析器工作得很好。根据我的数据库版本,我的语法可能有问题吗?
这是我要执行的操作:
CREATE TRIGGER insert_pad
BEFORE INSERT on vehicles FOR EACH ROW
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE localid CHAR(17);
DECLARE veh_mod CHAR(17);
DECLARE cur1 CURSOR FOR select id, RPAD(vin, 17,'Q') from vehicles where length(rtrim(vin)) < 17;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO localid, veh_mod;
IF done THEN
LEAVE read_loop;
END IF;
UPDATE vehicles SET vin = veh_mod WHERE id = localid;
END LOOP;
CLOSE cur1;
END;
如果有人有任何想法,我很想听听他们的意见!再次感谢!
解决方案
我没有看到分隔符的变化。否则,第 4 行的分号将终止语句,这将引发错误。
该DELIMITER
语句更改语句分隔符。我们想将其更改为一些未出现在我们要执行的语句中的字符串。在此示例中,我们将分隔符更改为两个美元符号,然后将其更改回默认分号。
DELIMITER $$
CREATE TRIGGER insert_pad
BEFORE INSERT on vehicles FOR EACH ROW
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE localid CHAR(17);
...
END$$
DELIMITER ;
另一个想法:我认为不允许触发器针对导致触发器被触发的语句中引用的表发出 DML(插入/更新/删除)。
但是在 BEFORE INSERT 触发器中,我们可以引用和修改将要插入的行的列的值。我们使用特殊限定符NEW.
来引用插入行中的列。例如:
DELIMITER $$
CREATE TRIGGER insert_pad
BEFORE INSERT ON vehicles FOR EACH ROW
BEGIN
-- if vin less than 17 characters, pad with Q
IF( CHAR_LENGTH(TRIM( NEW.vin )) < 17 ) THEN
SET NEW.vin = RPAD(TRIM( NEW.vin ), 17,'Q');
END IF;
END$$
DELIMITER ;
推荐阅读
- django - Django prefetch_related
- python - Python Multiprocessing (Flask) - 从主进程调用函数
- excel - 使用 SelectionChange 函数更改 ActiveX 控件按钮标题
- python - Pandas:删除列显示在另一个 DataFrame 中的行
- c# - Razor Pages - Foreach 循环遍历列表以获取要在 razor 视图上显示的数据
- python-3.x - 棘手的 Python Pandas 合并、连接或连接
- r - 确定嵌套列表是否在 R 中具有所有 NA 值时出现 sapply 问题
- jquery - 如何使用 jquery 将 2 个参数从表单添加到 URL
- c++ - 'LinkList' 没有命名类型
- ruby-on-rails - ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: 列 rooms.hotel 不存在 LINE 1: