时间戳(自动)何时更新?
Posted
技术标签:
【中文标题】时间戳(自动)何时更新?【英文标题】:When is a timestamp (auto) updated? 【发布时间】:2013-09-28 13:21:09 【问题描述】:如果我在TIMESTAMP
类型的表中有一个列并且默认具有: CURRENT_TIMESTAMP 如果我更新值,该列是否会更新为当前时间戳
任何列在同一行中?
似乎没有,但我不确定这是否应该发生。
我不明白这是什么意思(from mysql documentation):
如果列是自动更新的,它会自动更新为 当前时间戳,当行中任何其他列的值为 从当前值改变。如果所有列保持不变 其他列设置为其当前值。为了防止列 在其他列更改时更新,将其显式设置为 当前值。即使其他列没有更新列 更改,明确将其设置为应具有的值]2
【问题讨论】:
您为什么不通过创建test
表并更新示例数据来尝试此操作。顺便说一句,它不会在更新中更新timestamp
键入的列。如果没有在列定义中添加 ON UPDATE CURRENT_TIMESTAMP
【参考方案1】:
发出命令SHOW CREATE TABLE whatever
然后看table definition。
大概有这样一行
logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
在里面。 DEFAULT CURRENT_TIMESTAMP
表示任何没有明确时间戳设置的INSERT
都使用当前时间。同样,ON UPDATE CURRENT_TIMESTAMP
表示任何没有明确时间戳的更新都会导致对当前时间戳值的更新。
您可以在创建表格时控制此默认行为。
或者,如果时间戳列一开始没有正确创建,您可以更改它。
ALTER TABLE whatevertable
CHANGE whatevercolumn
whatevercolumn TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
这将导致表上的 INSERT 和 UPDATE 操作自动更新您的时间戳列。如果你想在不改变时间戳的情况下更新whatevertable
,也就是
防止列在其他列发生变化时更新
那么你需要发布这种更新。
UPDATE whatevertable
SET something = 'newvalue',
whatevercolumn = whatevercolumn
WHERE someindex = 'indexvalue'
这适用于 TIMESTAMP
和 DATETIME
列。 (在 MySQL 版本 5.6.5 之前,它仅适用于 TIMESTAMP
s)当您使用 TIMESTAMP
s 时,会考虑时区:在正确配置的服务器机器上,这些值始终以 UTC 存储并转换为本地时间检索时。
【讨论】:
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time
。在我的情况下,我在UPDATE
上有DEFAULT CURRENT_TIMESTAMP
但,该列not 已更新。所以我不清楚你在这句话中的意思
在我试图澄清的地方查看我的编辑。 INSERT 和 UPDATE 默认行为分别控制。
是的,提供时间戳列名称的 INSERT 和 UPDATE 操作都将覆盖默认的 current_timestamp 行为。
谢谢先生。完美解决我的问题之一
phpMyAdmin 说 SQL 查询有错误“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 'NOT NULL DEFAULT CURRENT_TIMESTAMP ON 附近使用的正确语法UPDATE CURRENT_TIMESTAMP' 在第 1 行"【参考方案2】:
当行中任何其他列的值从其当前值更改时,自动更新的列会自动更新为当前时间戳。如果所有其他列都设置为其当前值,则自动更新的列保持不变。
为了解释它,让我们假设你只有一行:
-------------------------------
| price | updated_at |
-------------------------------
| 2 | 2018-02-26 16:16:17 |
-------------------------------
现在,如果您运行以下更新列:
update my_table
set price = 2
它不会改变 updated_at 的值,因为价格值实际上并没有改变(它已经是 2)。
但如果您有另一行的价格值不是 2,则该行的 updated_at 值(价格 3)将更新为 CURRENT_TIMESTAMP。
【讨论】:
确认行为如 MySQL 中所述。此外,如果没有值更改,它不会算作INSERT
,因此像$this->pdo->lastInsertId()
这样的PHP 调用会返回0
(对于没有插入),而不是包含保持不变数据的行的id。
@OXiGEN - UPDATE
不是 INSERT
,所以我不希望 lastInsertId
包含一个值 - 不管是否有任何列更改。 lastInsertId
通常仅在 INSERT
新行 具有自动递增 ID 列(以找出分配的 ID)时使用;不是在更改现有行时。【参考方案3】:
在数据库中添加触发器:
DELIMITER //
CREATE TRIGGER update_user_password
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
IF OLD.password <> NEW.password THEN
SET NEW.password_changed_on = NOW();
END IF;
END //
DELIMITER ;
密码更改时间只有在密码栏发生更改时才会更新。
【讨论】:
【参考方案4】:添加在哪里可以找到UPDATE CURRENT_TIMESTAMP
,因为对于新人来说这是一个混乱。
大多数人会使用 phpmyadmin 或类似的东西。
您选择的默认值 CURRENT_TIMESTAMP
属性(不同的下拉菜单)您选择 UPDATE CURRENT_TIMESTAMP
【讨论】:
【参考方案5】:我认为你必须像这样定义时间戳列
创建表 t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );见here
【讨论】:
我的只有DEFAULT CURRENT_TIMESTAMP
以上是关于时间戳(自动)何时更新?的主要内容,如果未能解决你的问题,请参考以下文章
django django 有像 cakephp 这样的自动时间戳创建/更新字段吗?
sh 使用当前时间戳自动更新xcode项目内部版本号和构建版本