我没有从MySQL UPDATE触发器获得正确的输出。我正在使用MySQL 5.5.30。我的问题是基于这个MySQL触发器教程:http://www.sitepoint.com/how-to-create-mysql-triggers/。我将总结一下这个场景,你可以在MySQL客户端上试试这个。
CREATE TABLE `blog` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`title` text,
`content` text,
`deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `ix_deleted` (`deleted`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='Blog posts';
CREATE TABLE `audit` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`blog_id` mediumint(8) unsigned NOT NULL,
`changetype` enum('NEW','EDIT','DELETE','OTHER') NOT NULL,
`changetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `ix_blog_id` (`blog_id`),
KEY `ix_changetype` (`changetype`),
KEY `ix_changetime` (`changetime`),
CONSTRAINT `FK_audit_blog_id` FOREIGN KEY (`blog_id`) REFERENCES `blog` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
DELIMITER $$
CREATE
TRIGGER `blog_after_update` AFTER UPDATE
ON `blog`
FOR EACH ROW BEGIN
IF NEW.deleted THEN
SET @changetype = 'DELETE';
ELSE
SET @changetype = 'EDIT';
END IF;
INSERT INTO audit (blog_id, changetype) VALUES (NEW.id, @changetype);
END$$
DELIMITER ;
上例中的触发器'blog_after_update'有效。触发器的结果应该导致'EDIT'被插入到审计表的一行中。这是有效的,因为“已删除”列以外的其他列会更新。
然而,我稍微改变了教程中的触发器以重现我之后的TRIGGER,如下所述:
DELIMITER $$
CREATE
TRIGGER `blog_after_update` AFTER UPDATE
ON `blog`
FOR EACH ROW BEGIN
IF NEW.content THEN
SET @changetype = 'EDIT';
ELSE
SET @changetype = 'OTHER';
END IF;
INSERT INTO audit (blog_id, changetype) VALUES (NEW.id, @changetype);
END$$
DELIMITER ;
根据我的发现,这仍然导致ELSE块被执行。我期待IF块,即'SET @changetype ='EDIT';'执行。
有人能说明原因吗?
答案 0 :(得分:1)
我认为您正在查看某些内容是否已更改,然后将更改类型设置为编辑,您可以通过将新值与旧值进行比较来完成。
的东西DELIMITER $$
CREATE
TRIGGER `blog_after_update` AFTER UPDATE
ON `blog`
FOR EACH ROW BEGIN
IF NEW.content <> old.content THEN
SET @changetype = 'EDIT';
ELSE
SET @changetype = 'OTHER';
END IF;
INSERT INTO audit (blog_id, changetype) VALUES (NEW.id, @changetype);
END$$
DELIMITER ;