2013-04-24 83 views
0

我有下面这个触发器在emplog表中插入新值,我想让我的触发器插入描述列中发生的事件,例如,如果我更改了last_name我希望它出现old.lastname更改为new.last_name,如果它的名字或性别或dob或婚姻或ssn更新它应该做同样的,即时通讯新手我怎么能做到这一点让我说我想要使用concat函数?如何在此触发器中使用concat功能

CREATE TRIGGER emplog_update AFTER UPDATE ON emp 
FOR EACH ROW 
INSERT INTO emplog VALUES 
(NEW.id,NEW.lastname,NEW.firstname,NEW.gender,NEW.dob,NEW.marital,NEW.SSN,'U',NULL,USER(),('this is where the description will go')); 

回答

0

您可以使用select代替values生成列的列表。

可以使用concat_ws()将字符串连接在一起,方法是使用case语句比较值。以下版本假定列没有NULL值:

CREATE TRIGGER emplog_update AFTER UPDATE ON emp 
FOR EACH ROW 
INSERT INTO emplog (id, lastnmae, firstname, . . .) 
    select NEW.id,NEW.lastname,NEW.firstname,NEW.gender,NEW.dob,NEW.marital,NEW.SSN,'U',NULL,USER(), 
      concat_ws(',', 
        (case when new.id <> old.id then 'id' end), 
        (case when new.lastname <> old.lastname then 'lastname' end), 
        (case when new.firstname <> old.firstname then 'firstname' end), 
        . . . 
        ); 

作为一个说明,你应该列出在insert staetment表的列。这是保持代码可维护性的好实践,对触发器尤为重要。如果有人删除或重命名列,则触发器可能会在下次更新时失败,并带有难以理解的电子邮件消息。

用所有列的相似代码替换...

+0

即时获取此错误#1136 - 列计数不匹配第1行的值计数 – cleo 2013-04-24 18:43:21