2010-08-03 59 views
14

这似乎是一个非常简单的,但我努力想出来。我想要列出数据库中的一列,列出最初创建记录的时间,以及另一列记录何时更新记录。这是我的理解,我应该能够使用MySQL来做到这一切。所有的帮助表示赞赏:)'创建'和'更新'字段

这仍然太臭没有答案,原因我已经开始想念Ruby on Rails的...

+0

请你提出你的问题,我没有找到任何明确的。 – nepsdotin 2010-08-03 04:19:08

+1

mdgrech希望添加两个字段,其中包含表格行的创建时间和更新时间的时间戳。 – kiamlaluno 2010-08-03 04:23:46

+6

+1对我来说似乎很清楚 – 2010-08-03 04:24:05

回答

7

您可能需要使用Datetime数据类型的组合和Timestamp数据类型。我会将我的created列设置为DateTime,其中DEFAULT NOW()和我的updated列为Timestamp,其中DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP属性。

这里是为Timestamp DT文档:

与这两个:

http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

在CREATE TABLE语句中,第一个TIMESTAMP列可以在以下任何一种方式声明DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,该列具有其默认值的当前时间戳,并自动更新。

既不使用DEFAULT也不使用ON UPDATE子句,它与DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP相同。

使用DEFAULT CURRENT_TIMESTAMP子句并且没有ON UPDATE子句,该列具有默认值的当前时间戳记,但不会自动更新。

没有DEFAULT子句和ON UPDATE CURRENT_TIMESTAMP子句,该列的默认值为0,并自动更新。

具有固定的DEFAULT值,该列具有给定的默认值,并且不会自动初始化为当前时间戳。如果该列也有一个ON UPDATE CURRENT_TIMESTAMP子句,它会自动更新;否则,它具有固定的默认值,不会自动更新。

+1

从我所知道的你不能同时使用两个...如果你有一个DEFAULT CURRENT_TIMESTAMP的字段,你不能有一个ON UPDATE CURRENT_TIMESTAMP事件。 '#1293 - 表格定义不正确;在DEFAULT或ON UPDATE子句中只能有一个TIMESTAMP列' – Prix 2010-08-03 04:25:40

+0

您是对的,正在编辑答案... – 2010-08-03 04:28:00

+0

+1:正确的方法 - 添加两列并适当地设置DEFAULT约束。 – 2010-08-03 04:35:48

0

如果您不能使用具有Paul W建议的默认属性的时间戳字段,则可以使用AFTER INSERT和AFTER UPDATE触发器来填充字段。

+0

他只能使用1时间戳字段,将自动使用MySQL填充自己,第二将需要由PHP填充。 – Prix 2010-08-03 16:52:34

0

您需要两个字段“创建”和 “更新”与类型的日期时间。当插入 新条目,然后用当前时间戳插入 “已创建”。 当更新发生时,用当前时间戳 插入 “更新”,并且让“创建”字段保持为 。

对于当前时间戳,您可以在您的mysql查询中使用 NOW()。

1

为了完成你的问题和其他人查看这个问题,这里是答案。注意这是为MySQL 5.x编写的。

DROP TABLE IF EXISTS `test1`; 
CREATE TABLE `test1` (
    `id` INT NULL AUTO_INCREMENT , 
    `name` varchar(50) NOT NULL , 
    `created` DATETIME , 
    `updated` DATETIME , 
    PRIMARY KEY (`id`), 
    INDEX (`name`) 
); 

DELIMITER $$ 
DROP TRIGGER IF EXISTS `test1_created`$$ 
CREATE TRIGGER `test1_created` BEFORE INSERT ON `test1` 
    FOR EACH ROW BEGIN 
     SET NEW.`created` = UTC_TIMESTAMP(); 
     SET NEW.`updated` = UTC_TIMESTAMP(); 
    END; 
$$ 
DROP TRIGGER IF EXISTS `test1_updated`$$ 
CREATE TRIGGER `test1_updated` BEFORE UPDATE ON `test1` 
    FOR EACH ROW BEGIN 
     SET NEW.`updated` = UTC_TIMESTAMP(); 
    END; 
$$ 
DELIMITER ; 

注意

您可以使用时间戳,updated列这将自动更新,因此不需要在BEFORE UPDATE触发器的价值,但时间戳记从1970年至2038这即将来临我喜欢想我的应用程序将永远活着:)。尽管TIMESTAMP仅为4字节,而DATETIME为8字节。

TIMESTAMP range '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC

DATETIME range '1000-01-01 00:00:00' to '9999-12-31 23:59:59'

0

从MySQL 5.0中认证指南:

CREATE TABLE ts_test5 (
    created TIMESTAMP DEFAULT 0, 
    updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    data CHAR(30) 
); 

要控制TIMESTAMP列的初始化和更新行为,可以添加一个或两个的默认CURRENT_TIMESTAMP和ON将CURRENT_TIMESTAMP属性更新为使用CREATE TABLE创建表时的列定义... 和 ......如果你没有指定的DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性创建表时,MySQL的自动分配两者的第一个TIMESTAMP列

而且

你不能使用DEFAULT CURRENT_TIMESTAMP与一列和ON UPDATE CURRENT_TIMESTAMP与另一

+0

另外,即使您以这种方式设置了一个表格,然后从phpMyAdmin插入了一个新行,并且您未指定current_timestamp函数,则时间将为零时间戳。您需要在从phpMyAdmin添加行时指定current_timestamp。但是,SQL插入和更新将按预期工作。 – 2015-02-27 12:58:16