一、题目描述
题目链接: https://www.lintcode.com/learn/209/588.
描述:
为名为 members 的表创建了一个 UPDATE 触发器,要求实现数据修改后,记录修改信息 memberId = [id],message = ‘Update {[old]} To {[new]}’ 到 reminders 表中
[id] 为 members 中被修改的记录的主键 id
[old] 与 [new] 中参数说明:只显示有被修改到的字段,如:name 由 Tom 更新为 Jack ,[old] 显示为 [name=tom] ,[new] 显示为 [name=jack]
二、算法思想
题目要求message中只包含更新的信息,所以要对每个列的new值和old值进行比较。当old值和new值不一样时说明该列的信息更新了,这时要把更新信息放入message中;当old值和new值不一样时,不能把变动信息放进去,要把该部分设为’’。
由于水平有限,本代码中设定了很多变量来存储字符串,用了3个if语句判断信息是否变动,最后把字符串连接起来,就组合成了符合题意要求的字符串。
三、代码
create trigger after_update_members
after update
on members for each row
begin
--存储信息的8个变量
declare message varchar(255);
declare message1 varchar(255);
declare message2 varchar(255);
declare message3 varchar(255);
declare message4 varchar(255);
declare message5 varchar(255);
declare message6 varchar(255);
declare message7 varchar(255);
--字符串拼接过程中的中转变量
declare message11 varchar(255);
declare message12 varchar(255);
declare message13 varchar(255);
declare message14 varchar(255);
declare message15 varchar(255);
set message='Update {';
--判断姓名信息是否改变,
--若改变则把变动的信息存在message1和message5里,
--否则把它们设为''
if new.name!=old.name then
set message1=concat('[name=', old.name, '] ');
set message5=concat('[name=',new.name,'] ');
else
set message1='';
set message5='';
end if;
if new.email!=old.email then
set message2=concat('[email=',old.email,'] ');
set message6=concat('[email=',new.email,'] ');
else
set message2='';
set message6='';
end if;
if new.birthDate!=old.birthDate then
set message3=concat('[birthDate=',old.birthDate,'] ');
set message7=concat('[birthDate=',new.birthDate,'] ');
else
set message3='';
set message7='';
end if;
set message4='} To {';
--把判断好的各个部分拼接在一起
set message11=concat(message,message1 ,message2);
set message12=concat(message3,message4,message5);
set message13=concat(message6,message7);
set message14=concat(message11,message12,message13);
set message15=concat(message14,'}');
insert into reminders(memberId,message)
values(old.id,message15);
end
四、结果
菜鸟一只,欢迎大佬指教!