代码之家  ›  专栏  ›  技术社区  ›  Blake

通过MariaDB/MySQL不断获得1064

  •  0
  • Blake  · 技术社区  · 6 年前

    我正在努力获得下面的触发器来编译我的数据库。现在是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 回复  |  直到 6 年前
        1
  •  2
  •   spencer7593    6 年前

    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触发器中,我们可以引用和修改即将插入的行的列的值。我们使用特殊限定符 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 ;