Php 有没有办法在MySQL中为记录上最后更新的字段创建时间戳?

Php 有没有办法在MySQL中为记录上最后更新的字段创建时间戳?,php,mysql,timestamp,records,Php,Mysql,Timestamp,Records,有没有一种方法可以在mysql表中添加一个标记,我可以在每个记录中放置最后更新的字段的时间戳和字段名 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 然后在执行

有没有一种方法可以在mysql表中添加一个标记,我可以在每个记录中放置最后更新的字段的时间戳和字段名

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%'
有比像我想的那样做一个女人更好的方法,但我今天一辈子都想不出来

然后在执行更新查询时,它是这样的

$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%'

有比我想象中的广阔天地更好的方法,但我今天一辈子都想不起来了。

你可以用扳机实现你的目标。您不必更新指示已更新内容的列

请参见此示例:

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       

结果:

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

当然还有改进的余地,但你明白了,对吧?

你可以通过触发来实现你的目标。您不必更新指示已更新内容的列

请参见此示例:

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       

结果:

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

当然还有改进的余地,但你明白了,对吗?

你能再解释一下吗?你能不能添加一个名为LastUpdated或类似的列,并让它为该行的所有更新设置当前的时间戳?是的,但是我想知道哪一个字段是每一行中最后更新的,而不是最后更新的行。
ALTER TABLE
YOUR_TABLE\u NAME\u HERE`ADD
LastUpdated
TIMESTAMP ON UPDATE CURRENT\u TIMESTAMP not NULL DEFAULT CURRENT\u TIMESTAMP`添加另一个额外的列以与之配套“last updated field”并且让您的sql查询也填充它。在这两列之间,你有你想要的东西如果一次不止一列怎么办?TBH我们需要知道为什么(更多的上下文)才能给出最好的建议。你能再解释一下吗?你能不能添加一个名为LastUpdated或类似的列,并让它为该行的所有更新设置当前的时间戳?是的,但是我想知道哪一个字段是每一行中最后更新的,而不是最后更新的行。
ALTER TABLE
YOUR_TABLE\u NAME\u HERE`ADD
LastUpdated
TIMESTAMP ON UPDATE CURRENT\u TIMESTAMP not NULL DEFAULT CURRENT\u TIMESTAMP`添加另一个额外的列以与之配套“last updated field”并且让您的sql查询也填充它。在这两列之间,你有你想要的东西如果一次不止一列怎么办?TBH我们需要知道为什么(更多的上下文)才能给出最好的建议好的,我会给它一个机会并报告回来。谢谢。在我的示例中,您必须手动创建$fieldsupdated变量,但我假设您正在执行某种形式的输入验证等操作,因此您可以在这些验证案例中创建该字符串。OK,我将尝试并报告它。谢谢。在我的示例中,您必须手动创建$fieldsupdated变量,但我假设您正在执行某种形式的输入验证等操作,以便您可以在这些验证案例中创建该字符串。因为他一直在努力解决这样一个基本概念,触发器可能远远超出了这里的知识水平。但我喜欢这个解决方案,所以我要告诉你,因为他一直在努力解决这样一个基本的概念,触发器可能远远超出了这里的知识水平。但我喜欢这个解决方案,所以我会给你+1