代码之家  ›  专栏  ›  技术社区  ›  qadenza

仅在插入新行时设置当前时间戳

  •  0
  • qadenza  · 技术社区  · 7 年前

    date timestamp -默认值- CURRENT_TIMESTAMP

    我选择这个是因为希望当前日期时间在 inserting 一排新行。

    但每次更新另一列时都会更改。

    有办法保持 current_timestamp 仅在插入新行时 而不是 更新其他列时?

    3 回复  |  直到 7 年前
        1
  •  2
  •   VoteyDisciple    7 年前

    TIMESTAMP 列在每次更新时自动更新。一 DATETIME 列没有。

    你想要:

    your_column DATETIME DEFAULT CURRENT_TIMESTAMP
    

    这允许您在插入时指定一个默认值,就像对任何列一样,但因为它不是 时间戳 它将不再继续更新自己的每一个未来。 UPDATE .

        2
  •  1
  •   GMB    7 年前

    the documentation :

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

    所以你要避免 my_date_col 要在更新时自动更新的列,您需要显式保留其值,例如:

    UPDATE my_table SET my_col1 = 'foo', my_col2 = 'bar', my_date_col = my_date_col
    WHERE ...
    
        3
  •  0
  •   gmastro    7 年前

    当你奔跑

    SHOW FULL COLUMNS FROM `moufa`; -- where `moufa` is the name of the table in the example
    

    你可以看到这样的东西

    +-------+-------------+-----------+------+-----+---------------------+-------------------------------+---------------------------------+---------+
    | Field | Type        | Collation | Null | Key | Default             | Extra                         | Privileges                      | Comment |
    +-------+-------------+-----------+------+-----+---------------------+-------------------------------+---------------------------------+---------+
    | id    | smallint(6) | NULL      | NO   | PRI | NULL                | auto_increment                | select,insert,update,references |         |
    | ts    | timestamp   | NULL      | NO   |     | current_timestamp() | on update current_timestamp() | select,insert,update,references |         |
    +-------+-------------+-----------+------+-----+---------------------+-------------------------------+---------------------------------+---------+
    

    问题出在 ts 字段 Extra .检查你的桌子

    SHOW CREATE TABLE `moufa`;
    

    最常见的情况是 GMB 已发布该列已自动更新。

    现在,为了避免类似的进一步情况,您应该显式定义列的默认值。

    DROP TABLE IF EXISTS `moufa`; -- just for the example
    CREATE TABLE `moufa`( 
        `id` SMALLINT NOT NULL AUTO_INCREMENT, 
        `ts` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY(`id`)
    );
    

    或者,而不是删除并重新创建表

    ALTER TABLE `moufa`
      MODIFY COLUMN `ts` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;