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


79

如果我在类型表中具有一列,TIMESTAMP并且具有默认值:CURRENT_TIMESTAMP如果我更新同一行中任何其他列的值,此列是否会更新为当前时间戳?
似乎没有,但我不确定这是否应该发生。
我不明白这是什么意思(根据MySQL文档):

如果该列是自动更新的,则当该行中任何其他列的值从其当前值更改时,它将自动更新为当前时间戳。如果所有其他列均设置为其当前值,则该列保持不变。为防止当其他列更改时该列更新,请将其显式设置为其当前值。即使在其他列未更改的情况下也要更新该列,请将其显式设置为应具有的值] 2


2
您为什么不通过创建test表并更新示例数据来尝试此操作。顺便说一下,它不会timestamp在更新中更新类型列。如果未在列定义中添加ON UPDATE CURRENT_TIMESTAMP
Ravinder Payal,2016年

Answers:


137

发出命令 SHOW CREATE TABLE whatever

然后看表定义

它可能有这样一条线

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中,并在检索时转换为本地时间。


1
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time。在我的情况下,我在列上,DEFAULT CURRENT_TIMESTAMP 但是没有更新。因此,我不清楚您在这句话中的意思UPDATE
吉姆(Jim)

请参阅我试图澄清的内容。INSERT和UPDATE默认行为是分别控制的。
O. Jones

是的,给出时间戳列名称的INSERT和UPDATE操作都将覆盖默认的current_timestamp行为。
O. Jones

1
谢谢你,先生。完美解决我的问题之一
Edwinfad

phpMyAdmin表示SQL查询存在错误“您的SQL语法有错误;请在与MySQL服务器版本相对应的手册中找到在第1行'NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'附近使用的正确语法”
PrimožKralj

13

我认为您必须像这样定义时间戳列

创建表t1 
(
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP开启UPDATE CURRENT_TIMESTAMP
);

这里


1
我的只有DEFAULT CURRENT_TIMESTAMP
吉姆(Jim)

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 ;

仅当更改密码列时,密码更改时间才会更新。


3

当行中任何其他列的值从其当前值更改时,自动更新的列将自动更新为当前时间戳。如果将所有其他列设置为其当前值,则自动更新的列将保持不变。

为了说明这一点,让我们假设您只有一行:

-------------------------------
| 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如果值没有更改,则不算作是,因此类似PHP的调用$this->pdo->lastInsertId()将返回0(不插入)(而不是包含保持不变数据的行的id)。
OXiGEN

@OXiGEN-UPDATE不是INSERT,所以无论列是否更改,我都不会期望lastInsertId包含一个值。通常仅在具有自动递增ID列的新行(用于查找分配了哪些ID)时使用;更改现有行时不可用。lastInsertIdINSERT
ToolmakerSteve

2

添加地点,UPDATE CURRENT_TIMESTAMP因为对于新朋友来说这是一个困惑。

大多数人会使用phpmyadmin或类似的东西。

您选择的默认值CURRENT_TIMESTAMP

您选择UPDATE CURRENT_TIMESTAMP的属性(一个不同的下拉列表)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.