我想知道是否可以在表格中显示最近更新的列的列名。
示例:
**Original Record created on 03/20/14:**
Name: John
Height
Weight
Age
Update_date: 03/20/14
Update_Column: Name
然后有人进来并在2014年3月22日更新高度:
Name: John
Height: 5'9
Weight
Age
Update_date: 03/22/14
Update_Column: Height
如果有人进来并为年龄增加值,则Update_date和Update_column会再次更改。等等。
这可能吗?
此外,如果可以进行上述操作,如果用户同时更新了多个列,是否可以最右侧显示列名?
示例:
User updates the below record:
Name: John
Height: 5'9
Weight
Age
Update_date: 03/22/14
Update_Column: Height
并在2014年3月24日同时增加了体重和年龄:
Name: John
Height: 5'9
Weight: 150
Age: 31
Update_date: 03/22/14
Update_Column: Height
Update_Column将显示Age,因为它是最右边的。 (当你从左到右阅读时想到它,所以上次更新的列将是最右边的一列)
总而言之,我需要能够显示Updated_date(将是上次更新记录时的当前日期)和Updated_Col(更新的最后一列的列名,如果是多个)列被更新然后显示最后更新值的那个
希望这些例子有助于澄清事情。
谢谢, 史蒂芬
答案 0 :(得分:0)
您需要为每一行存储这些元数据。因此,您需要两个新列,即update_date和update_column。然后,您可以添加before update
触发器来检查哪些列即将更改并设置更新日期。
<强>更新强> 这是一个例子:
delimiter //
create table a (
id int (10) unsigned auto_increment,
a int(10),
b int(10),
update_date datetime NULL,
update_column varchar(16) NULL,
primary key (id)
)//
create trigger bu_a before update on a for each row begin
set NEW.update_date = NOW();
set NEW.update_column = NULL;
-- you need to start with the rightmost column if you want
-- that matched with the highest priority
if OLD.b != NEW.b then
set NEW.update_column = "b";
elseif OLD.a != NEW.a then
set NEW.update_column = "a";
end if;
end //
测试:
insert into a (id,a,b) values (1,1,1), (2,1,1), (3,1,1), (4,1,1)[
update a set b = 2 where id = 2;
update a set a = 2 where id = 3;
update a set a = 2 where id = 4;
update a set b = 2 where id = 4;
select * from a;
输出:
ID A B UPDATE_DATE UPDATE_COLUMN
1 1 1 (null) (null)
2 1 2 March, 24 2014 23:22:33+0000 b
3 2 1 March, 24 2014 23:22:33+0000 a
4 2 2 March, 24 2014 23:22:33+0000 b