''mysql中的单引号语法错误,但查询中没有单引号

时间:2014-06-18 11:34:09

标签: mysql if-statement

以下查询:

CREATE TRIGGER `Update_staff_contract_contract_document_last_changed` BEFORE UPDATE ON `staff_contract`
FOR EACH ROW BEGIN
    IF (new.Contract_document != old.Contract_document) THEN
        SET new.Contract_document_last_changed = UTC_TIMESTAMP();
    END IF;
END;

因此错误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失败。

但是查询中没有单引号。如果我删除它的开头/结尾和if / else语法,例如

CREATE TRIGGER `Update_staff_contract_contract_document_last_changed` BEFORE UPDATE ON `staff_contract`
FOR EACH ROW
    SET new.Contract_document_last_changed = UTC_TIMESTAMP();

它必须与begin / end或if / else有关,但我不知道是什么,有什么想法吗?

1 个答案:

答案 0 :(得分:1)

来自dev.mysql.com

通过使用BEGIN ... END构造,您可以定义执行多个语句的触发器。在BEGIN块中,您还可以使用存储例程(例如条件和循环)中允许的其他语法。但是,就像存储例程一样,如果使用mysql程序来定义执行多个语句的触发器,则需要重新定义mysql语句分隔符,以便可以使用;触发器定义中的语句分隔符。以下示例说明了这些要点。它定义了一个UPDATE触发器,用于检查用于更新每一行的新值,并将该值修改为0到100之间的范围。这必须是BEFORE触发器,因为在用于更新之前必须检查该值行

问题是您正在使用多个语句,并且应该使用默认情况下为;字符的语句分隔符将它们分开。

编辑一些额外的细节:

触发器主体中使用的默认分隔符和分隔符是相同的,MySQL认为CREATE TRIGGER语句以第一个;字符结束。在这种情况下,这意味着存在语法错误(因为BEGIN..END块并且触发器未完成)。

错误消息中的''表示存在空语句,而不是单引号或双引号。

您必须更改分隔符才能成功创建触发器:

DELIMITER //

CREATE TRIGGER `Update_staff_contract_contract_document_last_changed` BEFORE UPDATE ON `staff_contract`
FOR EACH ROW BEGIN
    IF (new.Contract_document != old.Contract_document) THEN
        SET new.Contract_document_last_changed = UTC_TIMESTAMP();
    END IF;
END//

DELIMITER ;