2015-02-23 51 views
0

在MySQL中,我想有一个类型为TIMESTAMP类型的表列,但其中不是更新到行更新当前时间戳。避免“在更新current_timestamp”

我的表是作为下面简单:

CREATE TABLE `test` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `lastAccess` TIMESTAMP NOT NULL, 
    PRIMARY KEY (`id`) 
); 

然后它被MySQL的创建类似如下:

DESCRIBE TABLE `test`; 
+------------+---------------------+------+-----+-------------------+-----------------------------+ 
| Field  | Type    | Null | Key | Default   | Extra      | 
+------------+---------------------+------+-----+-------------------+-----------------------------+ 
| id   | bigint(20) unsigned | NO | PRI | NULL    | auto_increment    | 
| lastAccess | timestamp   | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
+------------+---------------------+------+-----+-------------------+-----------------------------+ 

如何避免的默认值,以及作为“更新”行为?

我使用InnoDB引擎,如果它很重要。

MySQL版本:5.5.41-0ubuntu0.14.04.1

+0

改为使用日期时间字段?时间戳应该更新自己......或者包含更新中的字段,所以它是'update ... set lastaccess = lastaccess',使它用自己的当前值更新自己。 – 2015-02-23 17:23:03

+0

@MarcB感谢您的评论。我决定时间戳,因为它是(至少我认为它)基本上是一个UNIX时间戳(整数)和时区无关的(不是日历日期+挂钟时间,而是世界时间线上的一个点) - 也许我毕竟这个时间戳应该使用BIGINT ... – leemes 2015-02-23 17:26:04

回答

0

正如马克乙方在评论已经提到的TIMESTAMP默认行为是应该这样做。

我发现,当你设置在表中创建一个默认值(或ALTER吧),默认不再CURRENT_TIMESTAMP(明显),“上更新CURRENT_TIMESTAMP”的属性被删除(有趣) 。

CREATE TABLE `test` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `lastAccess` TIMESTAMP NOT NULL DEFAULT 0, 
    --        ^^^^^^^^^ 
    PRIMARY KEY (`id`) 
); 

而且有趣的是,如果你设置DEFAULT CURRENT_TIMESTAMP但省略了属性,它不设置。只有在提供没有默认时才会默默设置。