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);在更改现有行时不会。