MySQL - Exceção de valores padrão na base de dados


Como resolver a exceção do MySQL SQLSTATE[HY000]: Erro geral: 1364 O campo 'field_name' não tem um valor padrão

Saiba por que essa exceção é lançada no MySQL e como contorná-la.

O erro geral 1364 é basicamente acionado quando você tenta inserir/atualizar um registro em seu banco de dados onde um campo, ou seja, aquele que está acionando a exceção não pode ser nulo, porém você está tentando definir seu valor como nulo (você não está fornecendo um valor para ele). Normalmente, esta exceção só é acionada quando você está usando o MySQL no modo Strict , você pode obter o modo que seu servidor MySQL está usando com a seguinte consulta:

SELECT @@sql_mode;

Se você enfrentar essa exceção, provavelmente é porque você tem o modo estrito ativado ( STRICT_TRANS_TABLES). Neste artigo, compartilharemos com você duas maneiras de evitar que essa exceção apareça facilmente.

A. Solução lógica

Para evitar essa exceção, basta fornecer um valor para o campo que está acionando a exceção ou definir que o campo pode ser nulo, assim quando você tentar inserir um registro, o valor será nulo mas o erro não será lançado, por exemplo com uma coluna que não pode ser nula, a consulta a seguir lançaria a exceção:

INSERT INTO user (column_a, column_b) VALUES ("Value First Column", NULL);

Então você pode alterar a coluna para torná-la anulável:

ALTER TABLE YourTable MODIFY column_b VARCHAR(255) DEFAULT NULL;

E pronto, a exceção não deve aparecer mais.

B. Solução do lado do servidor

Se você não conseguir definir por si mesmo o valor da coluna porque está usando um framework ou outro tipo de lógica que primeiro insere o registro com null e depois o atualiza, você pode confiar na maneira fácil que é remover o modo estrito de MySQL. Isso de alguma forma não é recomendado, pois evita, por exemplo, a inserção de um valor vazio em uma coluna que não pode ser nula, lançando a exceção mencionada. Tudo acontece basicamente como uma medida de controle que impede que sua lógica falhe e impede que você escreva código flappy, onde você pode ignorar a lógica escrita errada etc.

Em outros casos, a lógica que você escreveu funciona em seu ambiente local, porque provavelmente você não definiu o modo estrito lá, mas em seu servidor de produção não funciona por causa desse modo. Neste caso, você pode desabilitar o strict mode modificando o arquivo de configuração do MySQL ( my.inino Windows ou my.cnfno Linux) configurando o sql_mode para uma string vazia ou removendo a  STRICT_TRANS_TABLESopção que configura o MySQL em Strict Mode e tendo o  NO_ENGINE_SUBSTITUTIONmodo habilitado:

[mysqld]
sql-mode=""
# Or
# sql-mode="NO_ENGINE_SUBSTITUTION"

Salve as alterações, reinicie o serviço mysql e o erro não aparecerá mais, em vez disso, a coluna será definida como nula, embora não seja permitido.


Você achou esse artigo útil?