时间戳(自动)何时更新?

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'

这适用于 TIMESTAMPDATETIME 列。 (在 MySQL 版本 5.6.5 之前,它仅适用于 TIMESTAMPs)当您使用 TIMESTAMPs 时,会考虑时区:在正确配置的服务器机器上,这些值始终以 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

以上是关于时间戳(自动)何时更新?的主要内容,如果未能解决你的问题,请参考以下文章

自动更新 NSManagedObject 属性修改时间戳

Vue momentjs 从时间戳实时更新相对时间

django django 有像 cakephp 这样的自动时间戳创建/更新字段吗?

sh 使用当前时间戳自动更新xcode项目内部版本号和构建版本

如何使mysql在每次修改行操作时自动将列更新为当前时间戳?

thinkphp5时间戳