No mysql 5.7.28 eu crio uma tabela assim:
create table t1 (
id int not null,
d1 timestamp)
engine=innodb;
que funciona bem e cria d1
como non-null
com default value current_timetamp
, on update current_timestamp
.
Mas quando tento criar a mesma tabela com dois campos timestamp conforme abaixo:
create table t1 (
id int not null,
d1 timestamp,
d2 timestamp)
engine=innodb;
Eu recebo um erro:
Erro SQL (1067): valor padrão inválido para 'd2'
Por que recebo um erro apenas quando adiciono um segundo campo de carimbo de data/hora?
Isso é um bug ou algum comportamento esperado no mysql?
Esse comportamento é descrito na variável de sistema explicit_defaults_for_timestamp , que por padrão é desabilitada para
5.6
,5.7
(e efetivamente desabilitada em5.1
) e é habilitada em8.0
.Citando o link acima:
Agora, o problema
5.7
é que oNO_ZERO_DATE
modo está ativado. Isso não permite que o valor padrão,0000-00-00 00:00:00
conforme descrito na documentação, seja adicionado como valor padrão (se não declarado explicitamente) nas colunas de carimbo de data/hora após a primeira .O Mysql
8.0
ainda tem oNO_ZERO_DATE
modo habilitado, mas oexplicit_defaults_for_timestamp
envvar está habilitado por padrão o que de acordo com a documentação adicionaria null como o valor padrão veja abaixo (o que não causará nenhum erro na criação da tabela ):Esse comportamento também foi discutido no rastreador de problemas do MySQL, mas foi marcado como "Não é um bug".
Como @Akina mencionou nos comentários, não confie em valores padrão. Sempre escreva a especificação completa para o campo.