2013-06-27 24 views
1

有没有办法在mysql表中添加一个标志,我可以把最后一个更新字段的时间戳记与每个记录中的字段名称?有没有办法为MySQL中的记录上的最后更新的字段创建时间戳?

+0

你能解释一下吗? –

+0

你不能只是添加一个名为LastUpdated的列或类似的东西,并让它为该行的所有更新设置current_timestamp? – Dave

+0

是的,但我想知道哪些是最后一次更新的字段,而不是最后一次更新的行。 –

回答

0
ALTER TABLE `YOUR_TABLE_NAME_HERE` ADD LastUpdatedColumns TEXT NULL; 
ALTER TABLE `YOUR_TABLE_NAME_HERE` ADD LastUpdated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 

然后做您的更新时,查询其像这样

$fieldsupdated = "field1, field2, field3"; 
$sql = "UPDATE `YOUR_TABLE_NAME_HERE` SET LastUpdatedColumns='$fieldsupdated'; 

然后,如果你想在未来的报告的最后时间/日期某列被编辑,你可以做类似

$sql = "SELECT LastUpdated FROM `YOUR_TABLE_NAME_HERE` WHERE LastUpdatedColumns LIKE '%field1%' 

有一种更好的方法可以做到,而不是像我想的那样广泛,但是我不能为了我今生的头脑而想到它。

+0

好吧,我会给它一个镜头并报告回来。谢谢。 –

+0

您必须在我的示例中手动创建$ fieldsupdated变量,但我假设您正在进行某种形式的输入验证等,因此您可以在这些验证案例中创建该字符串 – Dave

1

您可以通过触发器实现您的目标。您无需照顾更新指示已更新内容的列。

见下面的例子:

drop table if exists foo; 
create table foo(a int, b int, c int, 
       modified timestamp on update current_timestamp, 
       whichOne varchar(255) 
       ); 
insert into foo (a, b, c) values (1, 2, 3), (4, 5, 6); 

drop trigger if exists foomod; 
delimiter $$ 
create trigger foomod before update on foo 
for each row 
begin 
set @cols = ''; 
if old.a != new.a then 
set @cols = CONCAT(@cols, ', ', 'a'); 
elseif old.b != new.b then 
set @cols = CONCAT(@cols, ', ', 'b'); 
elseif old.c != new.c then 
set @cols = CONCAT(@cols, ', ', 'c'); 
end if; 
set new.whichOne = @cols; 
end $$ 
delimiter ; 

select * from foo; 

结果:

a b c modified whichOne 
1 2 3  
4 5 6  

update foo set b = 10 where b = 2; 

select * from foo; 

结果:

a b c modified whichOne 
1 10 3 2013-06-27 12:45:29Z , b 
4 5 6  

当然疗法e的改进空间,但你明白了,对吧?

+0

由于他正在为这样一个基本概念奋斗触发器可能在这里超出知识水平。但我喜欢这个解决方案,所以我会为你+1 – Dave

相关问题