【问题标题】:Strange behavior when updating timestamp column更新时间戳列时的奇怪行为
【发布时间】:2020-01-30 12:45:09
【问题描述】:

有 MariaDB-10.3.18 表为:

create table switching_log
(
    item_name varchar(20) NOT NULL,
    switched_off timestamp,
    switched_on timestamp
);

select * from switching_log;
+-----------+---------------------+---------------------+
| item_name | switched_off        | switched_on         |
+-----------+---------------------+---------------------+
| 201197010 | 2019-10-01 08:36:08 | 2019-10-01 08:35:49 |
+-----------+---------------------+---------------------+

当我更新“switched_off”时,“switched_on”不会改变

UPDATE switching_log set switched_off = now()   where item_name = '201197010';

select * from switching_log;
+-----------+---------------------+---------------------+
| item_name | switched_off        | switched_on         |
+-----------+---------------------+---------------------+
| 201197010 | 2019-10-01 08:40:28 | 2019-10-01 08:35:49 |
+-----------+---------------------+---------------------+

但是当我更新“switched_on”时,“switched_off”也更新了。

UPDATE switching_log set switched_on = now()   where item_name = '201197010';

select * from switching_log;
+-----------+---------------------+---------------------+
| item_name | switched_off        | switched_on         |
+-----------+---------------------+---------------------+
| 201197010 | 2019-10-01 08:40:40 | 2019-10-01 08:40:40 |
+-----------+---------------------+---------------------+

【问题讨论】:

  • 您使用的是哪个版本的 MySQL?
  • 萨尔曼A,MariaDB-10.3.18
  • @harp1814 运行SHOW CREATE TABLE switching_log。很可能,您在 switched_off 列上设置了以下属性:ON UPDATE CURRENT_TIMESTAMP
  • Madhur Bhaiya,太棒了!你是对的,谢谢!

标签: mysql sql timestamp mariadb


【解决方案1】:

This behavior is by design:

MariaDB 对使用 特定表中的 TIMESTAMP 数据类型。对于第一列 在特定表 MariaDB 中使用 TIMESTAMP 数据类型 自动将以下属性分配给列:

DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP 

这意味着如果列未在 INSERT 或 UPDATE 查询,然后 MariaDB 会自动初始化 列的值与当前日期和时间。

要解决此问题,请禁用时间戳列的“自动值”功能。最简单且可预测的方法是:

create table switching_log
(
    item_name varchar(20) NOT NULL,
    switched_off timestamp NULL,
    switched_on timestamp NULL
);

Demo on db<>fiddle

【讨论】:

  • 我试过 "switched_off timestamp DEFAULT NULL" 但得到 "ERROR 1067 (42000): Invalid default value for 'switched_off' "。所以 "switched_off timestamp DEFAULT "'0000-00-00 00:00:00'" 没问题
  • 如果未指定 NULL/NOT NULL,则时间戳列是 NOT NULL。所以除了零日期之外,另一个选择是使列可以为空(见小提琴)。
猜你喜欢
  • 2015-10-20
  • 1970-01-01
  • 2016-11-15
  • 2016-06-07
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
相关资源
最近更新 更多