【问题标题】:IF statement is not accepted in MySQL trigger, issuing Code 1064 but no reference into the statementMySQL 触发器中不接受 IF 语句,发出代码 1064 但未引用语句
【发布时间】:2021-12-15 17:04:04
【问题描述】:

我使用 MariaDB (10.3.29-MariaDB-0+deb10u1) 和 DbVisualizer (Pro 12.1.1 [Build #3237]) 作为 IDE。

我想通过让 MariaDB 将键设置为 UUID 来管理表的主键,我从这个开始

CREATE TRIGGER  before_pkey_maintenance
BEFORE INSERT ON maintenance
    FOR EACH ROW
       SET NEW.pkey = uuid();

效果很好,除了我开始提供自己的 UUID,当然,触发器重写了。仅当未提供 UUID 时,我才尝试以下方法来创建 UUID:

CREATE TRIGGER  before_pkey_maintenance
BEFORE INSERT ON maintenance
    FOR EACH ROW
        IF NEW.pkey IS NULL THEN
           SET NEW.pkey = uuid();
        END IF;

问题是,当我执行创建时,我得到以下错误:

[Code: 1064, SQL State: 42000]  (conn=1002) You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right syntax
to use near '' at line 5  [Script position: 132 - 168]

错误 1064 被记录为 (https://riptutorial.com/mysql/example/2995/error-code-1064--syntax-error) 没有正确使用反引号,我可以处理...除了该消息是指“在第 5 行使用靠近 '' 的语法”,即空字符串消息中的帮助不大。

我找到MySQL Trigger with IF statement returning #1064,它添加了“分隔符”的使用,并尝试了“|”、“//”和“$$”作为分隔符。我尝试了很多变体,都类似于以下内容:

delimiter $$

CREATE TRIGGER  before_pkey_maintenance
    BEFORE INSERT ON maintenance
        FOR EACH ROW
            IF NEW.pkey IS null THEN
               SET NEW.pkey = uuid();
            END IF;
END
$$
delimiter ;

...但它们都不起作用。

我查看了 DbVisualizer 的文档,没有发现任何表明它在幕后执行“魔术”的信息,但我怀疑如果上述任何一项正确,则 DbVis 正在单独执行这些操作。

【问题讨论】:

    标签: dbvisualizer


    【解决方案1】:

    这其实是 dbvisualizer 的一个“特性”。

    页面https://confluence.dbvis.com/display/UG121/Executing+Complex+Statements 描述了如何处理,关键是在分隔符语句和分号后添加一个'@':

    @delimiter $$;
    
    CREATE TRIGGER  before_pkey_maintenance
        BEFORE INSERT ON maintenance
            FOR EACH ROW
                IF NEW.pkey IS null THEN
                   SET NEW.pkey = uuid();
                END IF;
    $$
    @delimiter ;
    

    DbVis 页面基本上表明它是 SQL 之上的一个抽象级别,需要扩展语法,以便它可以分隔更复杂脚本的部分。

    【讨论】:

      【解决方案2】:

      基本上你也没有错误。从示例中复制代码并使用它,您将不再出现任何错误,您可能有某种不可见的字符,因此请删除所有内容。并使用theis代码

      CREATE tABLE maintenance (pkey VARCHAR(36))
      
      CREATE TRIGGER  before_pkey_maintenance
          BEFORE INSERT ON maintenance
              FOR EACH ROW
                  IF NEW.pkey IS null THEN
                     SET NEW.pkey = uuid();
                  END IF;
      END
      
      INSERT INTO maintenance VALUES (NULL)
      
      SELECT * FROM maintenance
      
      |键 | | :------------------------------------------------ | | c973e92c-3a6f-11ec-93bc-00163e55bd17 |

      db小提琴here

      这是一个带DELIMITER的版本

      delimiter $$
      
      CREATE TRIGGER  before_pkey_maintenance
          BEFORE INSERT ON maintenance
              FOR EACH ROW
                  IF NEW.pkey IS null THEN
                     SET NEW.pkey = uuid();
                  END IF;
      END
      $$
      delimiter ;
      

      【讨论】:

      • 我剪切并粘贴了您的两个示例,但它们都失败了 - 这让我相信问题出在 DbVisualizer 上。感谢您的帮助。
      【解决方案3】:

      我发现了这个https://mariadb.com/kb/en/trigger-keeps-creating-error/,这导致了我的解决方案:

      CREATE TRIGGER  before_pkey_maintenance
      BEFORE INSERT ON maintenance
      FOR EACH ROW
          SET new.pkey = IF (NEW.pkey is null or NEW.pkey = '', uuid(), NEW.pkey);
      

      尽管这适用于这种情况,但它不是一个完整的答案,因为如果触发器需要执行更复杂的代码,它不适合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 2012-04-13
        • 2021-10-23
        • 1970-01-01
        • 2020-02-15
        • 2013-01-28
        相关资源
        最近更新 更多