MySQL更新记录。日期列已重置

时间:2017-09-21 16:17:55

标签: mysql sql date

在下面的SQL my_date被重置为当前时间(执行更新的时间)。

我预计my_date列会保持不变。

任何人都可以解释这种行为吗?

create table abc (
  id bigint unsigned not null auto_increment primary key,
  my_date timestamp(6)
);

insert into abc(my_date) values (NOW() - INTERVAL 12 HOUR);
insert into abc(my_date) values (NOW() + INTERVAL 12 HOUR);
insert into abc(my_date) values (NOW() + INTERVAL 22 HOUR);

select * from abc;

1   2017-09-21 06:09:59.0
2   2017-09-22 06:09:59.0
3   2017-09-22 16:09:59.0

alter table abc add external_id varchar(30);
update abc set external_id = id;

select * from abc;

1   2017-09-21 18:10:46.000742744   1
2   2017-09-21 18:10:46.000742744   2
3   2017-09-21 18:10:46.000742744   3

1 个答案:

答案 0 :(得分:2)

两个选项:

  1. 启用系统变量:{​​{1}}
  2. 设置时间戳的默认值
  3. DEMO设置默认

    以这种方式定义表格(添加默认值0)演示显示没有默认值和w /默认值的行为。)

    explicit_defaults_for_timestamp

    默认值0强制系统仅在显示新值时更新my_date值,而不是在更新/插入其他列时更新。

    直接来自DOCS

    TIMESTAMP和DATETIME列没有自动属性,除非明确指定它们,但有以下异常:如果禁用了explicit_defaults_for_timestamp系统变量,则第一个TIMESTAMP列同时具有DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP(如果两者都未明确指定)。要禁止第一个TIMESTAMP列的自动属性,请使用以下策略之一:

      

    启用explicit_defaults_for_timestamp系统变量。在这种情况下,指定自动初始化和更新的DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句可用,但除非明确包含在列定义中,否则不会分配给任何TIMESTAMP列。

    或者,如果禁用explicit_defaults_for_timestamp,请执行以下任一操作:

      

    使用DEFAULT子句定义列,该子句指定常量默认值。

    指定NULL属性。这也会导致列允许NULL值,这意味着您无法通过将列设置为NULL来分配当前时间戳。分配NULL会将列设置为NULL,而不是当前时间戳。要分配当前时间戳,请将列设置为CURRENT_TIMESTAMP或同义词,例如NOW()。

    考虑这些表定义:

    create table SO46348743_abc (
      id bigint unsigned not null auto_increment primary key,
      my_date timestamp(6)  DEFAULT 0
    );