显示最近更新的列的列名称

时间:2014-03-24 23:04:52

标签: mysql sql oracle sql-update

我想知道是否可以在表格中显示最近更新的列的列名。

示例:

**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(更新的最后一列的列名,如果是多个)列被更新然后显示最后更新值的那个

希望这些例子有助于澄清事情。

谢谢, 史蒂芬

1 个答案:

答案 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