以下查询:
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有关,但我不知道是什么,有什么想法吗?
答案 0 :(得分:1)
通过使用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 ;