如何在此触发器中使用concat函数

时间:2013-04-24 17:09:12

标签: mysql triggers

我有下面的触发器在emplog表中插入新值,我想让我的触发器在描述列中插入发生的事件,例如,如果我更改了last_name,我希望它显示为old.lastname更改为new.last_name,如果它的名字或性别或dob或婚姻或ssn更新它应该做同样的,我是一个新手我怎么能实现这个让我说我想使用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')); 

1 个答案:

答案 0 :(得分: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标准中列出该表的列。这是保持代码可维护性的良好实践,对于触发器尤为重要。如果有人删除或重命名列,则触发器可能会在下次更新时失败,并带有难以理解的电子邮件消息。

...替换为所有列的类似代码。