Valor padrão inválido para o campo de data e hora 'create_date'

186

Eu tenho a seguinte instrução sql create

mysql> CREATE  TABLE IF NOT EXISTS `erp`.`je_menus` (
    ->   `id` INT(11) NOT NULL AUTO_INCREMENT ,
    ->   `name` VARCHAR(100) NOT NULL ,
    ->   `description` VARCHAR(255) NOT NULL ,
    ->   `live_start_date` DATETIME NULL DEFAULT NULL ,
    ->   `live_end_date` DATETIME NULL DEFAULT NULL , 
    ->   `notes` VARCHAR(255) NULL ,
    ->   `create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
    ->   `created_by` INT(11) NOT NULL ,
    ->   `update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,
    ->   `updated_by` INT(11) NOT NULL , 
    ->   `status` VARCHAR(45) NOT NULL ,
    ->   PRIMARY KEY (`id`) ) 
    -> ENGINE = InnoDB;

dando o seguinte erro

ERROR 1067 (42000): Invalid default value for 'create_date'

Qual é o erro aqui?

Robert
fonte
Não vejo nada de errado com a sua consulta e funciona na comunidade 5.1.50 recém testada.
Jaspreet Chahal
A consulta também está boa no meu final.
Shakti Singh
Não tem certeza, mas dê um nome diferente a esse campo e tente?
Naveen Kumar
Eu uso a comunidade mysql 5.1.56 no ubuntu 10.04. e não trabalhar
robert
5
A data sem zero requer uma data. Use '1970-01-01 00:00:01'. [retirado daqui] [1] [1]: dba.stackexchange.com/questions/6171/…
Jadeye

Respostas:

176

Isso ocorre devido ao modo SQL do servidor - NO_ZERO_DATE .

A partir da referência: NO_ZERO_DATE- No modo estrito, não permita '0000-00-00'como uma data válida. Você ainda pode inserir zero datas com a opção IGNORE . Quando não está no modo estrito, a data é aceita, mas um aviso é gerado.

Devart
fonte
19
como faço para dar a opção ignorar?
robert
9
Você não pode ignorar esta opção. Esta é a opção do servidor. Se você tiver acesso ao my.ini (arquivo de configuração mysql), remova NO_ZERO_DATE da opção modo sql e reinicie o servidor.
Devart
7
Para verificar esta opção - execute SHOW VARIABLES LIKE 'sql_mode'
Devart
6
eu gerei o script usando o mysql workbench. No script, o sql_mode é definido como tradicional. Se eu remover o tradicional, o script funcionará.
Robert
17
Nas preferências do MySQL Workbench, vá para a aba 'Model: MySQL'. Defina 'SQL_MODE para ser usado nos scripts gerados' como "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION" Isso resolve o problema definitivamente.
Sgtdck 28/01
140

Se você gerou o script a partir do ambiente de trabalho MySQL.

A seguinte linha é gerada

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

Remova TRADITIONAL do SQL_MODE e, em seguida, o script deve funcionar bem

Senão, você pode definir o SQL_MODE como Permitir datas inválidas.

SET SQL_MODE='ALLOW_INVALID_DATES';
Pankaj Shrestha
fonte
1
Salva-me algum tempo pesquisando por que diabos ele não está funcionando :)
Srneczek
5
Ahhh obrigada. SET SQL_MODE = 'ALLOW_INVALID_DATES'; foi um salva-vidas. Eu tive esse problema ao tentar migrar um site wordpress para outro servidor (local) e ele não me permitiu importar os dados do banco de dados devido a esse erro, mesmo que não houvesse linhas nas tabelas com esse erro.
Mikato
Trabalhou como um encanto! Obrigado.
moreirapontocom
52

O TIMESTAMP tem um intervalo de '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC (consulte o documento ). O valor padrão deve estar dentro desse intervalo.

Outro comportamento estranho, relacionado:

CREATE TABLE tbl1 (
    ts TIMESTAMP);  
Query OK, 0 rows affected (0.01 sec)

CREATE TABLE tbl2 (
    ts TIMESTAMP,
    ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'

CREATE TABLE tbl3 (
    ts TIMESTAMP,
    ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)

Nota lateral, se você deseja inserir NULLS:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);
Bret VvVv
fonte
1
Isso está acontecendo comigo. O que está acontecendo? ts2 não é nem "NOT NULL" ...!
584 PedroD #
2
Pode ser porque "Se você não definir um valor para a primeira coluna TIMESTAMP em uma tabela, o MariaDB atribuirá automaticamente a data e a hora atuais ao executar uma consulta UPDATE ou INSERT nas linhas em questão". - MariaDB Docs
jsphpl
1
Eu gosto do uso de column_name TIMESTAMP DEFAULT NOW(). Pode não ser apropriado para todas as situações, mas pensei em compartilhar, já que estava lidando com isso também.
DeezCashews
1
column_name TIMESTAMP DEFAULT '1970-01-01 00:00:01' fez o truque para mim. Obrigado!
metafa
42

No ubuntu desktop 16.04, fiz o seguinte:

  1. arquivo aberto: /etc/mysql/mysql.conf.d/mysqld.cnfem um editor de sua escolha.

  2. Procure sql_mode:, estará em algum lugar abaixo [mysqld].

  3. e defina sql_modeo seguinte:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. Salve e reinicie o serviço mysql fazendo:

    sudo service mysql restart

Mubashar Abbas
fonte
8
Ajudou, exceto que sql_modenão estava lá para a minha instância do mySQL no ubuntu16.04. Eu tive que adicionar uma entrada para ela no arquivo, removendo o "NO_ZERO_DATE". Então, aqui está como parece agora: #Adding o abaixo da linha para se livrar de no_zero_date sql_mode = ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
OK999
você está certo .. eu adicionei isso anteriormente para desativar o modo estrito .. e quando eu o editei para esse problema específico, a sql_modeentrada já estava lá.
Mubashar Abbas
Isso é um inseto? CURRENT_TIMESTAMP nunca deve retornar "0000-00-00 00:00:00", ou estou errado? Por que devo alterar as configurações do mysqld?
precisa saber é
@letsjump porque alguém configurou seu servidor mysql incorretamente. Estou atingindo esse problema com um banco de dados que importei. o valor padrão para o registro de data e hora em uma coluna não é um valor válido. a correção REAL é atualizar o carimbo de data / hora padrão para algo válido como 1970 - a data mais antiga disponível. A solução temporária é desativar a verificação no banco de dados.
precisa saber é o seguinte
9

Usando o OS X , instale o mysql do Homebrew , System Variables com base em seus padrões compilados. A solução é remover "NO_ZERO_DATE" das Variáveis ​​do sistema "sql_mode".

Apenas lembre-se de que o escopo envolve.

Se você deseja afetar apenas em sua sessão, use "@@session", por exemplo:

SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

Nesse caso, isso não será afetado quando a sessão for encerrada ou alterada. Não tem efeito em outra sessão.

Se você deseja afetar todos os clientes, use "@@global", por exemplo:

SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

Nesse caso, afeta apenas os clientes que se conectam após a alteração (não afetam todos os clientes atuais) e não funciona após a saída do servidor.

Joy Zhu
fonte
8

Consegui resolver esse problema no OS X instalando o MySQL a partir do Homebrew

brew install mysql

adicionando o seguinte a /usr/local/etc/my.cnf

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

e reiniciando o MySQL

brew tap homebrew/services
brew services restart mysql
dgitman
fonte
7

Eu tive um problema semelhante com o MySQL 5.7 com o seguinte código:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Corrigi usando isso:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

pyb
fonte
2
Eu acho que essa é realmente a melhor opção para quando faz sentido usar como padrão o atual, no entanto, não faria sentido para o registro de data e hora do nascimento - apenas como exemplo.
meow
7

Para evitar esse problema, você precisa remover NO_ZERO_DATEda configuração do modo mysql.

  1. Vá para 'phpmyadmin'.
  2. Depois que o phpmyadmin for carregado, clique na aba 'variáveis'.
  3. Procure por 'modo sql'.
  4. Clique na opção Editar e remova NO_ZERO_DATE(e sua vírgula à direita) da configuração.

Esse é um problema muito comum no ambiente local com wamp ou xamp.

Antonio Reyes
fonte
6

Basta definir as seguintes linhas na parte superior do arquivo SQL do banco de dados.

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

Está funcionando para mim.

Ashish Odich
fonte
2

Para desativar o modo SQL estrito

Create disable_strict_mode.cnf file at /etc/mysql/conf.d/

No arquivo, digite estas duas linhas:

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Finalmente, reinicie o MySQL com este comando:

sudo service mysql restart
Jatin Bhatti
fonte
1

Você pode examinar a configuração de fuso horário na instância do MySql:

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

no meu caso, percebi que o sistema subjacente tinha seu fuso horário definido como BST em vez de UTC; portanto, na tabela de criação, o padrão '1970-01-01 00:00:01' estava sendo coagido por 1 hora, resultando em um valor de carimbo de data / hora inválido.

Para mim, eu realmente queria que o fuso horário da máquina fosse definido como UTC, e isso me esclareceu. Como eu estava executando o Centos / 7, eu simplesmente

# timedatectl set-timezone UTC

e reiniciei tudo.

Robert Hook
fonte
1

Os valores padrão devem começar a partir do ano 1000.

Por exemplo,

ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'

Espero que isso ajude alguém.

David Beckwith
fonte
1

Mude isso:

`create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,

Para o seguinte:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
荒木 知
fonte
1
Da avaliação: Olá, por favor, não responda apenas com o código-fonte. Tente fornecer uma boa descrição sobre como sua solução funciona. Veja: Como escrevo uma boa resposta? . Thanks
quinta-feira
Se este for um site WordPress, não atualize as tabelas principais do WordPress. Muitos plug-ins esperam um valor de zeores; portanto, o WordPress não pode alterar esse valor padrão por motivos legados que poderiam interromper os plug-ins. Thread do Wordpress e suporte ao Wordpress . Alterar a estrutura do banco de dados sem familiarizar o código com os valores padrão pode levar a erros problemáticos. Embora isso possa funcionar como uma solução em muitos casos, pode causar estragos em outros. Não é uma solução universal.
SherylHohman em 25/02
0

Você pode mudar isso:

`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

Para algo assim:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',
Lucas Bustamante
fonte
0

Você pode mudar isso:

create_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',

Para algo assim:

create_date varchar (80) NÃO PADRÃO NULL '0000-00-00 00:00:00',

Ankush Singhal
fonte