仅在插入新行时设置current_timestamp

时间:2019-01-08 15:26:08

标签: mysql

date列为timestamp-默认值-CURRENT_TIMESTAMP

我之所以选择此选项,是因为希望将inserting上的当前日期时间作为新行。

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

是否只有在插入新行而不是更新其他列时才保留current_timestamp

3 个答案:

答案 0 :(得分:2)

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

您要

your_column DATETIME DEFAULT CURRENT_TIMESTAMP

这使您可以像插入任何列一样在插入时指定默认值,但是由于它不再是TIMESTAMP,因此以后每次UPDATE都不会继续更新自身。

答案 1 :(得分:1)

来自the documentation

  

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

因此,您要避免my_date_col列在UPDATE时自动更新,您想显式地保留其值,例如:

UPDATE my_table SET my_col1 = 'foo', my_col2 = 'bar', my_date_col = my_date_col
WHERE ...

答案 2 :(得分:0)

跑步时

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的{​​{1}}字段上。检查表是否运行

Extra

该列上最常见的情况,例如GMB,已自动更新。

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

SHOW CREATE TABLE `moufa`;

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

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`)
);