以下查询:
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失败。
但是,查询中没有单引号。如果我删除了begin/end和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();这肯定与开始/结束有关,或者是否与之相关,但我不知道,有什么想法吗?
发布于 2014-06-18 11:39:41
来自dev.mysql.com的报价
通过使用开始..。结构,您可以定义一个执行多个语句的触发器。在BEGIN块中,还可以使用存储例程中允许的其他语法,如条件和循环。但是,与存储的例程一样,如果使用mysql程序定义执行多个语句的触发器,则有必要重新定义mysql语句分隔符,以便在触发器定义中使用;语句分隔符。下面的示例说明了这些要点。它定义了一个更新触发器,该触发器检查用于更新每一行的新值,并修改在0到100之间的值。这必须是一个前置触发器,因为在使用该值更新行之前必须检查该值。
问题是,您正在使用多个语句,您应该使用语句分隔符来分隔它们,这是默认情况下的;字符。
编辑一些额外的细节:
触发器正文中使用的默认分隔符和分隔符是相同的,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 ;https://stackoverflow.com/questions/24284462
复制相似问题