何时更新时间戳(自动)?
如果我有一个types为TIMESTAMP
的表中的列,并且默认情况下是CURRENT_TIMESTAMP,那么如果我更新同一行中的任何其他列的值,该列是否会更新为当前时间戳?
它似乎没有,但我不知道这是怎么回事。
我不明白这是什么意思( 从MySQL文档 ):
如果该列是自动更新的,则当该行中的任何其他列的值从其当前值更改时,该列将自动更新为当前时间戳。 如果所有其他列都设置为当前值,则该列保持不变。 要防止其他列更改时更新列,请明确将其设置为其当前值。 即使其他列不更改,也要更新列,明确地将其设置为它应该具有的值
给命令SHOW CREATE TABLE whatever
然后看看表的定义。
它可能有这样的一条线
logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
在里面。 DEFAULT CURRENT_TIMESTAMP
意味着没有明确时间标记设置的任何INSERT
使用当前时间。 同样, ON UPDATE CURRENT_TIMESTAMP
表示任何没有明确时间戳的更新都会导致更新当前时间戳值。
创build表格时,您可以控制此默认行为。
或者,如果时间戳列没有正确创build,您可以更改它。
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
或DATE
列。 由于列是TIMESTAMP
,所以时区是考虑到的:在正确configuration的服务器机器上,这些值始终以UTC格式存储,并在检索时转换为本地时间。
我认为你必须像这样定义时间戳列
创build表t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
看到这里
在数据库中添加触发器:
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 ;
密码更改时间将只在密码列更改时更新。
添加在哪里可以findUPDATE CURRENT_TIMESTAMP
因为对于新人来说这是一个混乱。
大多数人会使用phpmyadmin或类似的东西。
您selectCURRENT_TIMESTAMP的默认值
属性 (不同的下拉列表)你selectUPDATE CURRENT_TIMESTAMP