2014-12-18 3 views
0

Я не получаю правильный вывод из MySQL UPDATE Triggers. Я использую MySQL 5.5.30. Моя проблема основана на этом учебнике MySQL Triggers: http://www.sitepoint.com/how-to-create-mysql-triggers/. Я подведу итог сценарию, и вы можете попробовать это на клиенте MySQL.MySQL Trigger UPDATE не запускается

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

Я думаю, что вы хотите проверить, изменился ли какой-либо контент, а затем изменить тип изменения как редактирование, и вы можете сделать это, сравнив новое значение со старым значением. Что-то вроде

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 ; 
+0

Спасибо, что: NEW.content <> old.content работал, а не NEW.content – stampkick