我有一个工作正常的触发器。
CREATE TRIGGER crm_listings__au
AFTER UPDATE
ON crm_listings FOR EACH ROW
INSERT INTO crm_listings_versions
SELECT
'update', NULL, NOW(), NULL, d.*
FROM
crm_listings AS d
WHERE
d.id = NEW.id;
现在我想跟踪字段列名称。我想我在上面的查询中做不到,所以我改为下面的触发器
CREATE TRIGGER crm_listings__au
BEFORE UPDATE
ON crm_listings
FOR EACH ROW
BEGIN
IF OLD.type != NEW.type
THEN
INSERT INTO crm_listings_versions
SELECT
'update', NULL, NOW(), 'type', d.*
FROM
crm_listings AS d
WHERE
d.id = NEW.id;
END IF;
IF OLD.price != NEW.price
THEN
INSERT INTO crm_listings_versions
SELECT
'update', NULL, NOW(), 'price', d.*
FROM
crm_listings AS d
WHERE
d.id = NEW.id;
END IF;
END;
$$
当我运行此代码时,我收到此错误:
您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第10行附近使用正确的语法
更新:
上关注了这篇文章答案 0 :(得分:0)
@kordirko:你能解释一下吗?
请学习文档:http://dev.mysql.com/doc/refman/5.7/en/stored-programs-defining.html
如果使用mysql客户端程序来定义存储的程序 包含分号字符,出现问题。 默认情况下,mysql 它本身将分号识别为语句分隔符,因此您必须这样做 暂时重新定义分隔符以使mysql传递整个分隔符 存储的程序定义到服务器。
要重新定义mysql分隔符,请使用delimiter命令。该 以下示例显示了如何为dorepeat()过程执行此操作 刚刚显示。分隔符更改为//以启用整个分隔符 定义要作为单个语句传递给服务器,然后 恢复到;在调用该过程之前。这使得; 在程序体中使用的分隔符将被传递给 服务器,而不是由mysql本身解释。
简单示例 - 我正在使用MySql Workbench并复制并粘贴了您的触发器。首先是一些虚拟表:
create table crm_listings(
id int,
type int,
price int
);
create table crm_listings_versions(
ttype varchar(100),
something varchar(100),
d date,
something1 varchar(100),
id int,
type int,
price int
);
现在我运行你的代码没有DELIMITER
CREATE TRIGGER crm_listings__au BEFORE UPDATE ON crm_listings
FOR EACH ROW
BEGIN
IF OLD.type != NEW.type
THEN
INSERT INTO crm_listings_versions SELECT 'update', NULL, NOW(), 'type', d.* FROM crm_listings AS d WHERE d.id = NEW.id;
END IF;
IF OLD.price != NEW.price
THEN
INSERT INTO crm_listings_versions SELECT 'update', NULL, NOW(), 'price', d.* FROM crm_listings AS d WHERE d.id = NEW.id;
END IF;
END;
$$
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 10 0.000 sec
结果=错误
然后相同,但使用 DELIMITER 命令:
DELIMITER $$
CREATE TRIGGER crm_listings__au BEFORE UPDATE ON crm_listings
FOR EACH ROW
BEGIN
IF OLD.type != NEW.type
THEN
INSERT INTO crm_listings_versions SELECT 'update', NULL, NOW(), 'type', d.* FROM crm_listings AS d WHERE d.id = NEW.id;
END IF;
IF OLD.price != NEW.price
THEN
INSERT INTO crm_listings_versions SELECT 'update', NULL, NOW(), 'price', d.* FROM crm_listings AS d WHERE d.id = NEW.id;
END IF;
END;
$$
DELIMITER ;
0 row(s) affected
结果=成功