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

Jim*_*Jim 68 mysql sql timestamp

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

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

O. *_*nes 116

发出命令 SHOW CREATE TABLE whatever

然后看一下表定义.

它可能有这样一条线

logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
Run Code Online (Sandbox Code Playgroud)

在里面. DEFAULT CURRENT_TIMESTAMP表示INSERT没有明确时间戳设置的任何一个使用当前时间.同样,ON UPDATE CURRENT_TIMESTAMP意味着没有显式时间戳的任何更新都会导致更新当前时间戳值.

您可以在创建表时控制此默认行为.

或者,如果首先未正确创建时间戳列,则可以更改它.

ALTER TABLE whatevertable
     CHANGE whatevercolumn 
            whatevercolumn TIMESTAMP NOT NULL
                           DEFAULT CURRENT_TIMESTAMP 
                           ON UPDATE CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

这将导致表上的INSERT和UPDATE操作自动更新时间戳列.如果要在whatevertable不更改时间戳的情况下进行更新,即

在其他列更改时阻止列更新

那么你需要发布这种更新.

UPDATE whatevertable
   SET something = 'newvalue',
       whatevercolumn = whatevercolumn
 WHERE someindex = 'indexvalue'
Run Code Online (Sandbox Code Playgroud)

并且,这TIMESTAMP仅适用于列,不适用于列DATETIMEDATE列.因为列是TIMESTAMPs,所以考虑时区:在正确配置的服务器计算机上,这些值始终以UTC格式存储并在检索时转换为本地时间.


jue*_*n d 12

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

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

看到这里

  • 我的只有“DEFAULT CURRENT_TIMESTAMP” (2认同)

Ale*_*der 6

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

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

-------------------------------
| price | updated_at          |
-------------------------------
|  2    | 2018-02-26 16:16:17 |
-------------------------------
Run Code Online (Sandbox Code Playgroud)

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

 update my_table
 set price = 2
Run Code Online (Sandbox Code Playgroud)

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

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