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