这看起来很简单,但我很难弄明白。我想在我的数据库中列出一个列,该列列出了第一次创建记录的时间,另一列列出了更新时间。这是我的理解我应该能够使用MySQL完成所有这些。所有帮助表示赞赏:)
这个问题仍然没有答案,原因我已经开始错过Ruby on Rails ...
答案 0 :(得分:7)
您可能需要使用Datetime
数据类型和Timestamp
数据类型的组合。我会将created
列设为DateTime
,DEFAULT NOW()
,将updated
列设为Timestamp
DEFAULT CURRENT_TIMESTAMP
,ON UPDATE CURRENT_TIMESTAMP
1}}属性。
以下是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 :(得分: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 ;
注意强>
您可以将TIMESTAMP用于updated
列,该列会自动更新该值,因此不需要BEFORE UPDATE触发器,但TIMESTAMP的范围从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'
答案 2 :(得分:0)
如果您不能将时间戳字段与Paul W建议的默认属性一起使用,则可以使用AFTER INSERT和AFTER UPDATE触发器来填充字段。
答案 3 :(得分:0)
您需要两个字段“已创建”和 “更新”,类型为datetime。当一个 插入新条目然后插入 “创建”与当前时间戳。 发生更新时插入 使用当前时间戳“更新”, 并让“创建”字段保持为 它是。
您可以使用当前时间戳 你的mysql查询中的NOW()。
答案 4 :(得分:0)
来自MySQL 5.0认证指南:
CREATE TABLE ts_test5 (
created TIMESTAMP DEFAULT 0,
updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
data CHAR(30)
);
要控制TIMESTAMP列的初始化和更新行为,在使用CREATE TABLE创建表时,可以将DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性中的一个或两个添加到列定义中... 和 ...如果在创建表时没有指定DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性,MySQL会自动将BOTH分配给第一个TIMESTAMP列
另外
您不能将DEFAULT CURRENT_TIMESTAMP与一列一起使用,而将UPDDATE CURRENT_TIMESTAMP与另一列一起使用