什么时候更新时间戳(自动)?

时间:2013-09-23 15:08:19

标签: mysql sql timestamp

如果我在类型TIMESTAMP的表中有一个列并且具有默认值:CURRENT_TIMESTAMP如果更新值,则此列会更新为当前时间戳 同一行中的任何其他列的内容?
它似乎没有,但我不确定这是否应该发生 我无法理解这意味着什么(from MySQL documentation):

  

如果该列自动更新,则会自动更新为   当行中任何其他列的值为时的当前时间戳   改变了它的当前价值。如果全部,列保持不变   其他列设置为其当前值。防止列   从其他列更改时更新,显式设置为其   当前值。即使其他列没有,也要更新列   更改,明确将其设置为应具有的值2

5 个答案:

答案 0 :(得分:99)

发出命令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列,而不适用于DATETIMEDATE列。由于列为TIMESTAMP s,因此会计入时区:在正确配置的服务器计算机上,这些值始终以UTC格式存储,并在检索时转换为本地时间。

答案 1 :(得分:10)

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

CREATE TABLE t1 
(
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

请参阅here

答案 2 :(得分:2)

在数据库中添加触发器:

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 :(得分:0)

添加查找UPDATE CURRENT_TIMESTAMP的位置,因为对于新人来说这是一个混乱。

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

您选择CURRENT_TIMESTAMP

的默认值 选择UPDATE CURRENT_TIMESTAMP

属性(不同的下拉列表)

答案 4 :(得分:0)

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

为了解释它,我们假设你只有一行:

-------------------------------
| price | updated_at          |
-------------------------------
|  2    | 2018-02-26 16:16:17 |
-------------------------------

现在,如果您运行以下更新列:

 update my_table
 set price = 2

它不会更改updated_at的值,因为价格值实际上没有改变(它已经是2)。

但是如果您有另一行的价格值不是2,那么该行的updated_at值(价格&lt;&gt; 3)将更新为CURRENT_TIMESTAMP。