在下面的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
答案 0 :(得分:2)
两个选项:
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
);