使用MariaDB / MySQL持续获得1064

时间:2018-10-12 15:03:37

标签: mysql mariadb

我正在努力获取下面的触发器来与我的数据库一起编译。现在,其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;

如果有人有任何想法,我很想听听他们的意见!再次感谢!

1 个答案:

答案 0 :(得分:2)

我没有看到定界符的变化。否则,第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(插入/更新/删除)。

但是在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 ;