MySQL时间戳字段 - 已创建/已修改

时间:2014-03-04 11:31:06

标签: mysql

我最近决定停止在我的表中的createdmodified日期字段使用MySQL触发器,因为在客户端部署时运行安装文件中包含的脚本时会出现问题。

我用这种方式改变了字段:(示例)

alter table users 
modify `created` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'

alter table users 
modify `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
        ON UPDATE CURRENT_TIMESTAMP 

当我现在运行我的程序并填写表单来添加数据(表单控件是数据绑定)时,我收到消息“创建列''不允许空值”。

在现有数据上,当我尝试更新时,修改日期根本不会改变。

我查看了许多文章,例如Having both a Created and Last Updated timestamp columns in MySQL 4.0但找不到解决方案。

我该如何解决这个问题?

我正在使用MySQL v 5.6.15.0

3 个答案:

答案 0 :(得分:4)

ALTER TABLE 'my_table'
CHANGE `created` TIMESTAMP DEFAULT 0,
CHANGE `modified` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

但请务必在插入数据时将'added_date'列明确设置为NULL

以下是一个例子:

mysql> CREATE TABLE ts_test5 (
-> created TIMESTAMP DEFAULT 0,
-> updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> data CHAR(30)
-> );
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO ts_test5 (created, data)
-> VALUES (NULL, ‘original_value’);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM ts_test5;
+---------------------+---------------------+----------------+
| created             |updated              |data            |   
+---------------------+---------------------+----------------+
| 2005-01-04 14:47:39 | 0000-00-00 00:00:00 | original_value |
+---------------------+---------------------+----------------+
1 row in set (0.00 sec)

mysql> . . . time passes . . .

mysql> UPDATE ts_test5 SET data=’updated_value’;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1
Changed: 1
Warnings: 0

mysql> SELECT * FROM ts_test5;
+---------------------+---------------------+---------------+
| created             |updated              |data           |
+---------------------+---------------------+---------------+
| 2005-01-04 14:47:39 | 2005-01-04 14:47:52 | updated_value |
+---------------------+---------------------+---------------+
1 row in set (0.00 sec)

答案 1 :(得分:2)

更改

alter table users modify 
   `created` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'

致:

alter table users modify 
   `created` TIMESTAMP NOT NULL DEFAULT now()

或者:

alter table users modify 
   `created` TIMESTAMP NOT NULL DEFAULT current_timestamp

答案 2 :(得分:0)

根据驱动程序的不同,0000-00-00日期可能会被视为空,这对您的列定义无效。但如果情况并非如此, 1970年之前的任何日期也不是有效的时间戳。

我尝试将“created”定义为DATETIME而不是TIMESTAMP

alter table users modify `created` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00'

(这是DATETIME可以采用的最低日期)。至于为什么修改的列不起作用,它是同一问题的一部分。表应该只有一个时间戳列,但是如果你放两个或更多,只有第一个可以有CURRENT_TIMESTAMP。愚蠢的mysql限制。

这个限制将在未来版本中取消,但我猜你的还没有。