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?
Respostas:
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.fonte
Se você gerou o script a partir do ambiente de trabalho MySQL.
A seguinte linha é gerada
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.
fonte
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:
Nota lateral, se você deseja inserir NULLS:
fonte
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.No ubuntu desktop 16.04, fiz o seguinte:
arquivo aberto:
/etc/mysql/mysql.conf.d/mysqld.cnf
em um editor de sua escolha.Procure
sql_mode
:, estará em algum lugar abaixo[mysqld]
.e defina
sql_mode
o seguinte:NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Salve e reinicie o serviço mysql fazendo:
sudo service mysql restart
fonte
sql_mode
nã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_SUBSTITUTIONsql_mode
entrada já estava lá.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: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: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.
fonte
Consegui resolver esse problema no OS X instalando o MySQL a partir do Homebrew
adicionando o seguinte a /usr/local/etc/my.cnf
e reiniciando o MySQL
fonte
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
fonte
Para evitar esse problema, você precisa remover
NO_ZERO_DATE
da configuração do modo mysql.NO_ZERO_DATE
(e sua vírgula à direita) da configuração.Esse é um problema muito comum no ambiente local com wamp ou xamp.
fonte
Basta definir as seguintes linhas na parte superior do arquivo SQL do banco de dados.
Está funcionando para mim.
fonte
Para desativar o modo SQL estrito
No arquivo, digite estas duas linhas:
Finalmente, reinicie o MySQL com este comando:
fonte
Você pode examinar a configuração de fuso horário na instância do MySql:
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
e reiniciei tudo.
fonte
Os valores padrão devem começar a partir do ano 1000.
Por exemplo,
Espero que isso ajude alguém.
fonte
Mude isso:
Para o seguinte:
fonte
Você pode mudar isso:
Para algo assim:
fonte
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',fonte