【发布时间】:2010-06-09 20:19:46
【问题描述】:
我需要跟踪在我的 mysql 数据库中创建用户的日期和时间。我有一个名为“created”的列,数据类型为 TIMESTAMP。
问题在于,当用户更改密码或其他信息时,TIMESTAMP 值会发生变化。我怎样才能将其设置为不更改????
【问题讨论】:
我需要跟踪在我的 mysql 数据库中创建用户的日期和时间。我有一个名为“created”的列,数据类型为 TIMESTAMP。
问题在于,当用户更改密码或其他信息时,TIMESTAMP 值会发生变化。我怎样才能将其设置为不更改????
【问题讨论】:
听起来您没有正确设置时间戳列:
查看guide:
*
Auto-initialization and auto-update:
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
*
Auto-initialization only:
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
*
Auto-update only:
ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
*
Neither:
ts TIMESTAMP DEFAULT 0
【讨论】:
您可能只想将其默认子句设置为CURRENT_TIMESTAMP(如其他答案中所述的@Mark 和@dcp):
CREATE TABLE your_table (
...
`created_timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
测试用例:
CREATE TABLE tb (`a` int, `c` TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.04 sec)
INSERT INTO tb (a) VALUES (1);
Query OK, 1 row affected (0.01 sec)
SELECT * FROM tb;
+------+---------------------+
| a | c |
+------+---------------------+
| 1 | 2010-06-09 23:31:16 |
+------+---------------------+
1 row in set (0.00 sec)
UPDATE tb SET a = 5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
SELECT * FROM tb;
+------+---------------------+
| a | c |
+------+---------------------+
| 5 | 2010-06-09 23:31:16 |
+------+---------------------+
1 row in set (0.00 sec)
编辑:
在我最初的回答中,我建议使用 DATETIME 列,并将 DEFAULT 子句设置为 CURRENT_TIMESTAMP。然而,这只有在使用 TIMESTAMP 数据类型时才有可能,如 stated in documentation:
数据类型规范中的
DEFAULTvalue 子句表示列的默认值。除了一个例外,默认值必须是一个常量;它不能是函数或表达式。这意味着,例如,您不能将日期列的默认值设置为诸如NOW()或CURRENT_DATE之类的函数的值。例外情况是您可以将CURRENT_TIMESTAMP指定为TIMESTAMP列的默认值。
【讨论】:
使用日期时间列。时间戳自动更新。
【讨论】:
将其更改为DEFAULT CURRENT_TIMESTAMP,否则它将自动更新。来自manual:
在 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 子句时,该列的默认值具有当前时间戳,但不会自动更新。
强调我的。
【讨论】:
将其设为日期时间?
【讨论】:
date() 正确格式化插入的字符串。updating。【讨论】:
当你创建表时,你应该省略 ON UPDATE
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
应该是
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
【讨论】:
在属性下,禁用“更新 CURRENT_TIMESTAMP”。
【讨论】:
在你的情况下这有点脏,但你可以暂时禁用自动更新:
UPDATE woot SET password=<value_to_set>, timestamp_colum_name=timestamp_colum_name;
(在那里找到它:http://www.xarg.org/2010/06/disable-on-update-current-timestamp-in-mysql/)
【讨论】: