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

Mysql 如何在此触发器中使用concat函数,mysql,triggers,Mysql,Triggers,我在下面有一个触发器,它在一个emplog表中插入新值,我想让我的触发器在“描述”列中插入发生的事件,例如,如果我更改了姓氏,我希望它显示为旧的。姓氏已更改为新的。姓氏,如果它是被更新的名字、性别、dob、婚姻或ssn,它应该做同样的事情,我是一个新手,我怎样才能做到这一点,让我们说我想使用concat功能 CREATE TRIGGER emplog_update AFTER UPDATE ON emp FOR EACH ROW INSERT INTO emplog VALUES (NEW

我在下面有一个触发器,它在一个emplog表中插入新值,我想让我的触发器在“描述”列中插入发生的事件,例如,如果我更改了姓氏,我希望它显示为旧的。姓氏已更改为新的。姓氏,如果它是被更新的名字、性别、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')); 

您可以使用
select
而不是
values
来生成列列表

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

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),
                     . . .
                    );
emp更新后创建触发器emplog\u更新
每行
插入emplog(id、lastname、firstname等)
选择NEW.id,NEW.lastname,NEW.firstname,NEW.gender,NEW.dob,NEW.monthly,NEW.SSN,'U',NULL,USER(),
concat_ws(',',
(当new.id old.id然后“id”结束时的情况),
(当new.lastname old.lastname然后“lastname”结束时为大小写),
(new.firstname old.firstname然后“firstname”结束时的情况),
. . .
);
请注意,您应该在
insert
statement中列出该表的列。这是保持代码可维护性的良好实践,对于触发器尤其重要。如果有人删除或重命名列,则触发器可能会在下一次更新时失败,并显示一条难以捉摸的电子邮件消息


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

我有点收到此错误#1136-列计数与第1行的值计数不匹配