Mysql 时间戳(自动)何时更新?
如果我在类型为Mysql 时间戳(自动)何时更新?,mysql,sql,timestamp,Mysql,Sql,Timestamp,如果我在类型为TIMESTAMP的表中有一列,并且默认为:CURRENT\u TIMESTAMP,那么如果我更新该值,该列是否会更新为当前时间戳 同一行中任何其他列的名称? 似乎没有,但我不确定这是否应该发生。 我不明白这是什么意思(): 如果列是自动更新的,它将自动更新为 行中任何其他列的值为时的当前时间戳 已从其当前值更改。如果所有选项都被选中,则该列保持不变 其他列设置为其当前值。为了防止柱 从其他列更改时更新,显式将其设置为 当前值。即使其他列不更新该列,也要更新该列 更改,显式将其设置
TIMESTAMP
的表中有一列,并且默认为:CURRENT\u TIMESTAMP,那么如果我更新该值,该列是否会更新为当前时间戳
同一行中任何其他列的名称?似乎没有,但我不确定这是否应该发生。
我不明白这是什么意思(): 如果列是自动更新的,它将自动更新为 行中任何其他列的值为时的当前时间戳 已从其当前值更改。如果所有选项都被选中,则该列保持不变 其他列设置为其当前值。为了防止柱 从其他列更改时更新,显式将其设置为 当前值。即使其他列不更新该列,也要更新该列 更改,显式将其设置为应有的值]
我认为您必须像这样定义timestamp列 CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
创建表t1
(
ts TIMESTAMP更新当前时间戳时的默认当前时间戳
);
请参见给出命令
SHOW CREATE TABLE which
然后看看这张照片
它可能有这样一条线
CREATE TABLE t1
(
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
在里面<代码>默认当前时间戳意味着没有明确时间戳设置的任何
插入
都使用当前时间。同样,更新当前时间戳时的表示任何没有显式时间戳的更新都会导致对当前时间戳值的更新
您可以在创建表时控制此默认行为
或者,如果一开始没有正确创建时间戳列,您可以对其进行更改
ALTER TABLE whatevertable
CHANGE whatevercolumn
whatevercolumn TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
这将导致表上的INSERT和UPDATE操作自动更新timestamp列。如果要更新whatevertable
而不更改时间戳,即
防止列在其他列更改时更新
然后你需要发布这种更新
UPDATE whatevertable
SET something = 'newvalue',
whatevercolumn = whatevercolumn
WHERE someindex = 'indexvalue'
这适用于TIMESTAMP
和DATETIME
列。(在MySQL版本5.6.5之前,它仅适用于时间戳
s)当您使用时间戳
s时,会考虑时区:在正确配置的服务器机器上,这些值始终存储在UTC中,并在检索时转换为本地时间。添加查找位置更新当前\u时间戳
,因为对于新手来说这是一种困惑
大多数人会使用phpmyadmin或类似的东西
选择当前时间戳的默认值
属性(另一个下拉列表)选择更新当前时间戳在数据库中添加触发器:
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 ;
分隔符//
创建触发器更新\用户\密码
在更新用户之前
每行
开始
如果是OLD.password NEW.password,则
设置NEW.password_changed_on=NOW();
如果结束;
结束//
定界符;
密码更改时间仅在密码列更改时更新。当行中任何其他列的值从其当前值更改时,自动更新的列将自动更新为当前时间戳。如果所有其他列都设置为当前值,则自动更新的列将保持不变。
为了解释它,我们假设您只有一行:
-------------------------------
| price | updated_at |
-------------------------------
| 2 | 2018-02-26 16:16:17 |
-------------------------------
现在,如果运行以下更新列:
update my_table
set price = 2
它不会更改更新的_at的值,因为价格值实际上没有更改(它已经是2)
但是,如果您有另一行的price值不是2,则该行的updated\u at值(price为3)将更新为CURRENT\u TIMESTAMP。我的只有默认CURRENT\u TIMESTAMP
默认CURRENT\u TIMESTAMP意味着任何没有显式时间戳设置的插入都会使用CURRENT time
。在我的例子中,我有默认的当前\u时间戳
,但在更新
上,列没有更新。因此,我不清楚你在这句话中的意思。请看我试图澄清的编辑。INSERT和UPDATE默认行为是单独控制的。是的,提供时间戳列名称的INSERT和UPDATE操作将覆盖默认的当前时间戳行为。谢谢先生。完美解决方案我的一个问题SphpmyAdmin说SQL查询有一个错误“您的SQL语法有一个错误;请检查与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在第1行使用接近“非空默认当前时间戳更新当前时间戳”的语法”为什么不创建一个test
表并更新示例数据来尝试这一点呢。顺便说一下,它不会在更新中更新timestamp
键入的列。如果在更新当前时间戳时未在列定义中添加此项,请确认MySQL中描述的行为。此外,如果没有值更改,则它不算作INSERT
,因此像$this->pdo->lastInsertId()
这样的PHP调用返回0
(对于无插入),而不是包含保持不变的数据的行的id。@OXiGEN-UPDATE
不是INSERT
,因此,我不希望lastInsertId
包含一个值,无论任何列是否更改lastInsertId
通常仅在INSERT
新行具有自动递增ID列时使用(以找出分配了什么ID);在更改现有行时不会。