Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MariaDB/MySQL继续获取1064_Mysql_Mariadb - Fatal编程技术网

使用MariaDB/MySQL继续获取1064

使用MariaDB/MySQL继续获取1064,mysql,mariadb,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 在我的环境中,我得到: Error Code: 1

我正在努力使用我的数据库编译下面的触发器。现在是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
在我的环境中,我得到:

 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错误匹配……但奇怪的是,其他解析器工作得很好。 基于我的DB版本,我的语法可能有问题

以下是我试图执行的内容:

 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 insert/update/delete

但在BEFORE INSERT触发器中,我们可以引用和修改即将插入的行的列的值。我们使用新的特殊限定符。引用要插入的行中的列。例如:

 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 ;

我看不到分隔符有变化。否则,第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/update/delete

但在BEFORE INSERT触发器中,我们可以引用和修改即将插入的行的列的值。我们使用新的特殊限定符。引用要插入的行中的列。例如:

 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 ;

将字段名和表包装在backticks中`-这些应该可以在MariaDB上使用-注意到它对像u和这样的字符有点严格-知道SELECT*…只是一个有趣的事实。。。使用组tbl1.name不是真正有效的ANSI SQL..将字段名和表换行到backticks`-这些应该可以在MariaDB上使用-注意到它对像u和这样的字符有点严格-知道SELECT*…只是一个有趣的事实。。。组tbl1.name不是真正有效的ANSI SQL..我喜欢你的第二部分。。。我更喜欢它,而不是我尝试的光标。谢谢工作得很好。祝你周末愉快。我喜欢你的第二部分。。。我更喜欢它,而不是我尝试的光标。谢谢工作得很好。祝你周末愉快。