Erro 1364 do mysql O campo não tem valores padrão

113

Minha mesa parece

create table try ( name varchar(8), CREATED_BY varchar(40) not null);

e então eu tenho um gatilho para preencher automaticamente o campo CREATED_BY

create trigger autoPopulateAtInsert BEFORE INSERT on try for each row set new.CREATED_BY=user();

Quando faço uma inserção usando

insert into try (name) values ('abc');

a entrada é feita na tabela, mas ainda recebo a mensagem de erro

Field 'CREATED_BY' doesn't have a default value Error no 1364

Existe uma maneira de suprimir esse erro sem tornar o campo anulável E sem remover o triggfer? Caso contrário, meu hibernate verá essas exceções (mesmo que as inserções tenham sido feitas) e então o aplicativo irá travar.

kk1957
fonte

Respostas:

28

Defina um valor padrão para Created_By(por exemplo: vazio VARCHAR) e o acionador atualizará o valor de qualquer maneira.

create table try ( 
     name varchar(8), 
     CREATED_BY varchar(40) DEFAULT '' not null
);
KinSlayerUY
fonte
Como definir um valor padrão em um programa Java?
Nagarajan Shanmuganathan
1
você precisa de um valor padrão na definição da tabela (criar tabela try (nome varchar (8), CREATED_BY varchar (40) DEFAULT '' não nulo))
KinSlayerUY
Isso não resolve o problema raiz. Veja a resposta muito mais extensa de Phyxx abaixo.
csvan
3
A resposta de @csvan Phyxx também não aborda a causa raiz porque a causa raiz era um bug no MySQL que foi corrigido na v5.7.1 - veja a resposta em B98: stackoverflow.com/a/29854279/5389997 A remoção do modo sql strict_trans_table torna o MySQL mais propenso a erros de qualidade de dados, então removê-los não é um bom conselho.
Shadow de
205

Isso é causado pelo STRICT_TRANS_TABLESmodo SQL definido no

% PROGRAMDATA% \ MySQL \ MySQL Server 5.6 \ my.ini

Arquivo. Remover essa configuração e reiniciar o MySQL deve resolver o problema.

Consulte https://www.farbeyondcode.com/Solution-for-MariaDB-Field--xxx--doesn-t-have-a-default-value-5-2720.html

Se a edição desse arquivo não corrigir o problema, consulte http://dev.mysql.com/doc/refman/5.6/en/option-files.html para outras localizações possíveis de arquivos de configuração.

Phyxx
fonte
5
Você pode executar uma consulta SQL em sua ferramenta de gerenciamento de banco de dados, como phpMyAdmin: -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria
5
mas talvez você queira STRICT_TRANS_TABLES?
Andrew,
no meu caso o campo é do tipo DATETIME com o padrão definido como NULL, e ainda estou vendo o mesmo erro, tenho dois esquemas no mesmo banco de dados. um para Staging, outro para produção, com as mesmas estruturas de mesa. Ele funciona em um esquema, mas não funciona em outro com exatamente a mesma estrutura de tabela em ambos. Estou perplexo. Não tenho certeza se é um problema com STRICT_TRANS_TABLES
dresh 01 de
1
Eu removi STRICT_TRANS_TABLES de /etc/my.cnf - na linha começando com sql_mode - e reiniciei o serviço mysql e o problema foi embora.
Mike Volmar
92

Abra o phpmyadmin e vá para a guia 'Mais' e selecione o submenu 'Variáveis'. Role para baixo para encontrar o modo sql. Edite o modo sql e remova 'STRICT_TRANS_TABLES' Salve-o.

Nilesh Dhangare
fonte
22
Esta pergunta é sobre o MySQL e não faz nenhuma menção ao phpmyadmin. Por favor, não presuma que todo mundo tem isso funcionando.
Chris
2
@ jackadams49 Esta mudança não persiste. Você pode me informar o que fez para que essa mudança sobrevivesse a uma reinicialização do sistema?
LD James
8
@ jackadams49 para fazê-lo permanecer, sudo nano /etc/mysql/my.cnfadicionar [mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", salvar e sair, e reiniciar mysql sudo service mysql restart
maan81
1
Para adicionar, eu tive que alterar os valores de sql_modepara nulo, ou seja, sql_mode = ""para outros erros semelhantes.
maan81
Recentemente, atualizamos nosso MySQL para 5.7. Estávamos enfrentando muitos problemas. Isso funcionou para mim. Salvou meu dia.
Aluno de
38

No phpmyadmin, execute o seguinte:

select @@GLOBAL.sql_mode

No meu caso, recebo o seguinte:

ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES ,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Copie este resultado e remova STRICT_TRANS_TABLES. Em seguida, execute o seguinte:

set GLOBAL sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
Kamil
fonte
sim, mas para isso você precisará fazer login no phpmyadmin com conta root :) super conta
user889030
1
depois de passar quatro horas, essa solução funcionou para mim no Ubuntu 16.04. Ótimo !
Waleed Ahmed
3
você não precisa de phpmyadminnada, use esses comandos na mysqllinha de comando.
gustyaquino
4
isso será redefinido para o padrão após a reinicialização do mysql / server / pc. Você precisa editar /etc/mysql/mysql.conf.d/mysqld.cnf, e depois [mysqld] adicione esta linha: sql_mode = 'ONLY_FULL_GROUP_BY, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_UBSTITUTION'
waza123
solução por @ waza123, esta funciona para mim após a atualização para o mysql 5.7.20. obrigado
fredy kardian
28

Quando tive esse mesmo problema com o mysql5.6.20 instalado com o Homebrew, resolvi acessando my.cnf

nano /usr/local/Cellar/mysql/5.6.20_1/my.cnf

Encontre a linha assim:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

Comente a linha acima e reinicie o servidor mysql

mysql.server restart

O erro desapareceu!

Kingsley Ijomah
fonte
15

Execute o console mysql:

mysql -u your_username -p

, selecione o banco de dados:

USE your_database;

e execute (também no console mysql):

SET GLOBAL sql_mode='';

Isso desligará o modo estrito e o mysql não reclamará mais.

Para deixar as coisas claras: sua definição de banco de dados diz "este campo deve ter um valor padrão definido" e, seguindo os passos acima, você diz ao MySql "sim, simplesmente ignore". Portanto, se você deseja apenas fazer alguma correção rápida localmente, esta solução está ok. Mas geralmente você deve investigar em sua definição de banco de dados e verificar se o campo realmente precisa do valor padrão e, se for o caso, defina-o. E se o valor padrão não for necessário, este requisito deve ser removido para ter uma situação limpa.

MilanG
fonte
Sim, não adicione um padrão, apenas remova as regras, ótima solução (sarcasmo implícito) nunca faça isso um ótimo exemplo ruim. No entanto, ele resolve o problema
zardilior de
1
Sim, concordo com você. Mas às vezes você tem o projeto de outras pessoas, que está funcionando bem, ou seja, em produção (onde o modo estrito não está definido) e você só quer adicionar algum pequeno recurso ou correção de bug, trabalhando localmente. Você não quer lutar contra os dragões, apenas para fazer aquela coisa da * n funcionar. :)
MilanG
para esse cenário, eu concordo
zardilior
@zardilior qual é o problema? o valor padrão é escolhido com base no tipo de coluna se a regra for removida .. Não vejo nada de errado nisso: / essa regra é muito severa sem motivo.
Reloecc
1
Nem um pouco severo, ele apenas força você a declarar um padrão ou fornecer um valor, também o modo estrito funciona para muito mais coisas do que apenas isso, então desabilitá-lo, em vez de declarar um erro na coluna ou passar o valor, é realmente terrível mor ein prod. Você desabilitou um dos bons personagens do mysql lá
zardilior
13

Como outros disseram, isso é causado pelo STRICT_TRANS_TABLESmodo SQL.

Para verificar se o STRICT_TRANS_TABLESmodo está ativado:

SHOW VARIABLES LIKE 'sql_mode';

Para desativar o modo estrito:

SET GLOBAL sql_mode='';
Damjan Pavlica
fonte
Removido manualmente "STRICT_TRANS_TABLES" de variáveis> sql_mode para teste e funcionou!
Prem popatia
1
Você salvou meu dia.
umarbilal de
Para mim, depois de executar o segundo comando e verificar sql_mode (primeiro comando), ele não faz nada. Mesmo depois de reiniciar o serviço mysql. Debian 9
trainoasis
12

Antes de cada ação de inserção, adicionei a linha abaixo e resolvi meu problema,

SET SQL_MODE = '';

Não tenho certeza se esta é a melhor solução,

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Vinith
fonte
1
Não é necessário fazer isso antes de cada ação de inserção, apenas faça uma vez no início do seu script, logo após conectar-se ao banco de dados, e toda consulta de inserção funcionará sem o erro "Campo não possui um valor padrão".
José Carlos PHP
Esta solução é boa porque você não precisa alterar tabelas (pode haver muitos campos para alterar).
José Carlos PHP
11

Seu trabalho e cópia testada para arquivo de configuração: /etc/mysql/my.cnf OR /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

então reinicie o MySQL

Devraj Gupta
fonte
9

Modifique sua consulta e adicione "IGNORE" como:

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Rohit Dhiman
fonte
isso funcionou para mim - meu script PHP abortaria, mas com IGNORE, ele apenas exibe uma nova linha! Agora, quão "seguro" é ter IGNORE codificado na consulta PHP-MYSQL? Eu uso isso para adicionar linhas automaticamente, para o novo "dia", onde não existia antes
Levchik
@Levchik Quando você usa IGNORE, então em vez de um erro, o MySQL emite um aviso quando um erro acontece, e tentará completar a instrução de alguma forma: mysqltutorial.org/mysql-insert-ignore
Stefan
6

Para usuários do Windows WampServer :

WAMP> MySQL> my.ini

arquivo de pesquisa para sql-mode=""

Remova o comentário.

Andrew
fonte
2
Na minha versão, tive que mudar: sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"para sql-mode="". Descomentar sql-mode=""causou o erro.
Juliano,
5

Isso parece ser causado por um bug de longa data (desde 2004) (# 6295) no MySQL , intitulado

Os gatilhos não são processados ​​para colunas NOT NULL .

Ele foi supostamente corrigido na versão 5.7.1 do MySQL (Changelog, última entrada) em 2013, fazendo o MySQL se comportar “de acordo com o padrão SQL” (ibid).

B98
fonte
Eu atualizei de 5.6 para 5.7.11 e o problema foi corrigido para mim (e a remoção de STRICT_TRANS_TABLES não funcionou para mim), então estou votando a favor e negando o resto das respostas
knocte
5
@knocte Nem todo mundo pode atualizar o MySQL em seu sistema, então não vale a pena votar a favor disso.
JulienD
A única resposta que realmente me ajuda. Remover a NOT NULLrestrição ou adicionar valor padrão à coluna corrigiu o problema. O gatilho funciona conforme o esperado.
Ruslan Stelmachenko
3

No Windows Server edite my.ini (por exemplo, arquivos de programa \ mysql \ servidor mysql nn \ my.ini)

Eu não definiria simplesmente sql-mode = "", mas sugiro remover STRICT_TRANS_TABLES da linha, deixar tudo como estava e reiniciar o MySQL a partir do utilitário de serviços. Adicione um comentário para futuros programadores sobre quem você é e o que fez.

Bill Degnan
fonte
Esta resposta diz o mesmo. stackoverflow.com/a/52004654/10431118
karma4917
De um modo geral, sim, mas meu ponto é que estou dizendo especificamente para não apagar todos os valores do sql-mode, mas sim para remover apenas STRICT_TRANS_TABLES, pois isso é tudo que você precisa. Caso contrário, você pode afetar algum outro serviço.
Bill Degnan
1

configurei os campos para não nulos e o problema foi resolvido, ele atualiza quando uma informação é comandada para armazenar nele, não mais mostrando a mensagem msqli de que o campo estava vazio porque você não inseriu valor nele, bem, a aplicação desta solução pode funcionar em alguns projetos depende da estrutura do projeto.

ExploreTech
fonte
Ele resolveu meu erro alterando o defaultatributo da coluna de nonepara NULL. A menos que haja respostas de alta classificação! meu cPanel estava me dando acesso negado em hospedagem compartilhada quando tentei atualizar a variável sql_mode.
Rashid
0

Resolvi o problema ao alterar o arquivo my.ini localizado na pasta de dados. para mysql 5.6, o arquivo my.ini foi movido para a pasta de dados em vez da pasta de instalação bin ou mysql.

Sadik Keskin
fonte
0

Acho que na coluna de nome temos valores nulos neste caso.

update try set name='abc' where created_by='def';
  
Sasindu
fonte