【问题标题】:set current_timestamp only on inserting a new row仅在插入新行时设置 current_timestamp
【发布时间】:2019-06-03 07:53:03
【问题描述】:

datetimestamp - 默认值 - CURRENT_TIMESTAMP

我选择这个是因为想要在inserting 一个新行上的当前日期时间。

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

有没有办法让current_timestamp 只在插入新行时而不是在更新另一列时?

【问题讨论】:

  • 为什么默认值与更新期间发生的事情有任何关系?我认为默认值仅与插入相关。
  • 显示你的CREATE TABLE
  • @TimBiegeleisen,不,每次更改另一列时都会更改。

标签: mysql date sql-update sql-insert create-table


【解决方案1】:

当你跑步时

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;

【讨论】:

  • MODIFY COLUMN ts` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;` - 它已经有那个值了?
  • 运行 SHOW FULL COLUMNS FROM x 后的额外内容是什么; ?
  • 额外的日期列是空的
  • 您是否尝试再次更新它我的意思是UPDATE `x` SET `field1` = 123 WHERE `id` = x; 它是否再次更改了时间戳?通常它不应该只要它没有被定义
【解决方案2】:

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

你想要:

your_column DATETIME DEFAULT CURRENT_TIMESTAMP

这使您可以在插入时指定一个默认值,就像您为任何列所做的那样,但由于它不再是 TIMESTAMP,它不会继续使用每个未来的 UPDATE 进行自我更新。

【讨论】:

  • This lets you specify a default value at the time of insertion like you would for any column - 请解释一下 - 如果我在插入时指定了某些内容 - 这不是默认值。
  • DEFAULT 关键字指定插入时的默认值。如果您省略了INSERT 中的列,那么CURRENT_TIMESTAMP 就是该列中的内容。
【解决方案3】:

来自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 ...

【讨论】:

  • 谢谢,我明白了,但必须说 - 这是一种史前编程方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多