MySQL触发UPDATE不触发

时间:2014-12-18 23:40:35

标签: mysql stored-procedures triggers

我没有从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';'执行。

有人能说明原因吗?

1 个答案:

答案 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 ;