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

  ask by Blake translate from so

未解决问题?本站智能推荐:

2回复

使用MySQL和MariaDB创建表Order产生1064错误

我正在尝试使用MySQL和MariaDB创建一个名为Order的表。 我已经删除了除表ID之外的所有内容。 如果我将表名更改为类似Test的名称,则可以使用,但是将表创建为Order,“ Order”或“ Order”不起作用。 SQL: 错误信息: 但这有效: MySQL版
3回复

MySQL/MariaDB交易访问冲突1064

我在事务查询方面遇到了一些麻烦。 我有2个表,“主题”和链接表调用“ tutorsubjects”。 我正在使用MariaDB 10.0.21版。 我创建了以下查询,但始终收到“语法错误或访问冲突:1064”错误。 以下是解析到查询的值 我收到以下错误: SQLSTATE [
1回复

如何解释mariadb/mysql中的Synax错误1064

考虑以下 sql 查询: 这将返回通用语法“您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,以获取使用近字符串的正确语法” 是否有可能收到如下错误? : 应为有效类型,但遇到了“字符串”
1回复

在MySQL/MariaDB中创建过程并定义变量导致错误#1064

我正在尝试在mysql / mariadb中创建一个带有声明变量的SP - 但是我没看到,它有什么问题!?! DROP PROCEDURE IF EXISTS UpdateReceiverDevice;DELIMITER $$CREATE PROCEDURE `UpdateReceiverDev
1回复

MYSQL:错误1064(42000)MariaDB服务器,用于在'NOTNULL'附近使用的正确语法

整个错误代码如下: 第1行出现错误1064(42000):您的SQL语法有错误; 检查与您的MariaDB服务器版本相对应的手册以在'NOT NULL'附近使用正确的语法 它告诉我我的语法不正确,但是这是我缺少的代码:
1回复

MariaDB和1064错误

执行以下代码时出现以下错误: 第 21 行的 ERROR 1064 (42000):您的 SQL 语法有错误; 检查与您的 MariaDB 服务器版本相对应的手册,以了解在@LINE_TERMINATION@ 附近使用的正确语法这是我用来创建表的代码: 这是我用来填充表格的代码: 任何意见是极大的
1回复

使用MySQL而不是MariaDB的XAMPP?

基本上,我想知道在哪里可以找到使用良好的MySQL而不是MariaDB的XAMPP发行版。 我有一个可以在MySQL 5.5.16上正常运行的Drupal站点,但是当我在MySQL 10.1.0-MariaDB上运行它时(这是我下载的较新XAMPP附带的内容),如果不破坏缓存,就无法清除缓存。
1回复

SQL错误(1064)语法MariaDB

我无法一生解决这个问题。 我有以下运行的SQL语句,它告诉我错误在ORDER BY d GROUP BY d; 线 该代码可在MS Access 2013中使用,因为那里有相同的表。 在这种情况下,我使用的MariaDB与MySQL基本相同,因此我不确定是否缺少任何语法更改。 谢谢