如果我在类型TIMESTAMP
的表中有一个列并且具有默认值:CURRENT_TIMESTAMP如果更新值,则此列会更新为当前时间戳
同一行中的任何其他列的内容?
它似乎没有,但我不确定这是否应该发生
我无法理解这意味着什么(from MySQL documentation):
如果该列自动更新,则会自动更新为 当行中任何其他列的值为时的当前时间戳 改变了它的当前价值。如果全部,列保持不变 其他列设置为其当前值。防止列 从其他列更改时更新,显式设置为其 当前值。即使其他列没有,也要更新列 更改,明确将其设置为应具有的值2
答案 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
列,而不适用于DATETIME
或DATE
列。由于列为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。