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列。

+0

这是正确的,SQL Server的时间戳实际上只是rowversion的同义词 – SQLMenace 2010-08-15 18:12:43

+0

这会执行,但updated_at字段在更改时不会自动更新。我认为在updated_at列上添加ON UPDATE CURRENT_TIMESTAMP会解决这个问题。那是当它抱怨说这是无法完成的。 – Aishwar 2010-08-15 18:14:33

+0

是的,正如我所说:你需要使用触发器来填充updated_at列 – 2010-08-15 18:51:15

据我所知,这个限制没有解决方法。您需要手动设置(至少)其中一个时间戳,最简单的方法是将updated = NOW()添加到UPDATE-查询中。

+0

+1但这似乎是一个可行的解决方案。我真的很喜欢它,如果服务器可以自动完成的话:) – Aishwar 2010-08-15 18:17:27

+0

尽管可能触发器,但我认为这不是一个好的解决方案。 – 2010-08-15 19:59:09

+0

通常反之亦然:您手动指定'created = NOW()'并且'updated'自动设置。原因是你创造了一次记录,但更新可以是无限的。 – Stalinko 2018-02-23 07:44:41

您需要两列:CREATE_TIME和UPDATE_TIME。

您可能想要添加CREATE_USER和UPDATE_USER。

也许你想与列名改变,旧值和新值有1:多关系。

它是变化数据捕获的所有部分。您可以使用触发器更新CDC表。

+0

我确实有2列来存储创建时间和更新时间 - 但我不能设置我指出的两个默认值。我会研究什么是CDC。难道这不是一个简单的解决方案吗?我想这是一个常见的情况。 – Aishwar 2010-08-15 18:16:39

+0

这很常见,但我不相信MySQL有一个内置的解决方案。 Oracle和SQL Server做。不应该很难做到:几张桌子和触发器。 – duffymo 2010-08-15 18:18:59

我会按照您的建议保留当前时间戳,并在插入时使用当前日期填写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/

+2

这是我找到的最佳解决方案。神奇的是,NULL被插入到NOW()上。在一个典型的应用程序中,将有更多的方式来更新行,而不是创建它,所以这感觉就像在创建和手动处理更新时使用单独的触发器或其他方法使用“现在一个”时的维护更少。 – botimer 2015-05-29 21:49:38

+1

工作出色!虽然在我的情况下,我似乎不需要传入空值,只更新了列。似乎运作良好。 '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

+0

现在这是最好的答案! – v010dya 2017-09-24 07:34:36