MySQL创建时间和更新时间时间戳
我正在创建一些表格,用于存储创建记录和上次更新记录的时间。我以为我可以有两个时间戳字段,其中一个的值为CURRENT_TIMESTAMP
,另一个则为CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
。但我想我不能这样做,因为你可以只有一个时间戳字段在表中的默认值?MySQL创建时间和更新时间时间戳
你会如何推荐我得到和存储两次?谢谢!
您可以在一个表中有两列类型的时间戳。
为MySQL 5.0
create table t ( id integer, created_at timestamp default current_timestamp, updated_at timestamp );
我认为你是使用SQL Server(其中timestamp是不是一个真正的“时间戳”也的确是一个限制在一个单一的“时间戳”列混淆这样做的以下工作)
编辑:但是每次更改行时,您都需要一个触发器来更新update_at列。
您需要两列:CREATE_TIME和UPDATE_TIME。
您可能想要添加CREATE_USER和UPDATE_USER。
也许你想与列名改变,旧值和新值有1:多关系。
它是变化数据捕获的所有部分。您可以使用触发器更新CDC表。
我会按照您的建议保留当前时间戳,并在插入时使用当前日期填写created_at字段。
一个很好的方式来创建像“创造”和“更新”字段是
CREATE TABLE `mytable` (
`id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
`created` TIMESTAMP DEFAULT '0000-00-00 00:00:00',
`updated` TIMESTAMP DEFAULT now() ON UPDATE now(),
`myfield` VARCHAR(255)
);
而且其必要在“插入”进入空成两列:
INSERT INTO mytable (created,updated,myfield) VALUES (null,null,'blablabla');
而现在,在所有更新中,“更新”字段将在实际日期中具有新值。
UPDATE mytable SET myfield='blablablablu' WHERE myfield='blablabla';
来源:http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
这是我找到的最佳解决方案。神奇的是,NULL被插入到NOW()上。在一个典型的应用程序中,将有更多的方式来更新行,而不是创建它,所以这感觉就像在创建和手动处理更新时使用单独的触发器或其他方法使用“现在一个”时的维护更少。 – botimer 2015-05-29 21:49:38
工作出色!虽然在我的情况下,我似乎不需要传入空值,只更新了列。似乎运作良好。 'created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,'... – Jordan 2017-11-07 01:29:28
随着MySQL版本5.6.5,你可以做到这一点使用DEFAULT和ON UPDATE。不需要触发器。
ts_create
TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ts_update
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
现在这是最好的答案! – v010dya 2017-09-24 07:34:36
这是正确的,SQL Server的时间戳实际上只是rowversion的同义词 – SQLMenace 2010-08-15 18:12:43
这会执行,但updated_at字段在更改时不会自动更新。我认为在updated_at列上添加ON UPDATE CURRENT_TIMESTAMP会解决这个问题。那是当它抱怨说这是无法完成的。 – Aishwar 2010-08-15 18:14:33
是的,正如我所说:你需要使用触发器来填充updated_at列 – 2010-08-15 18:51:15