Error 1364 de mysql El campo no tiene valores predeterminados

113

Mi mesa parece

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

y luego tengo un disparador para completar automáticamente el campo CREATED_BY

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

Cuando hago una inserción usando

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

la entrada se realiza en la tabla pero sigo recibiendo el mensaje de error

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

¿Hay alguna manera de suprimir este error sin hacer que el campo sea anulable Y sin eliminar el triggfer? De lo contrario, mi hibernación verá estas excepciones (aunque se hayan realizado las inserciones) y luego la aplicación se bloqueará.

kk1957
fuente

Respuestas:

28

Establezca un valor predeterminado para Created_By(por ejemplo: vacío VARCHAR) y el disparador actualizará el valor de todos modos.

create table try ( 
     name varchar(8), 
     CREATED_BY varchar(40) DEFAULT '' not null
);
KinSlayerUY
fuente
¿Cómo establecer un valor predeterminado en un programa Java?
Nagarajan Shanmuganathan
1
necesita un valor predeterminado en la definición de la tabla (crear tabla try (name varchar (8), CREATED_BY varchar (40) DEFAULT '' not null))
KinSlayerUY
Esto no soluciona el problema de raíz. Vea la respuesta mucho más extensa de Phyxx a continuación.
csvan
3
La respuesta de @csvan Phyxx no aborda la causa raíz porque la causa raíz fue un error en MySQL que se solucionó en v5.7.1; vea la respuesta de B98: stackoverflow.com/a/29854279/5389997 La eliminación del modo sql estricto_trans_table hace que MySQL sea más propenso a errores de calidad de datos, por lo que eliminarlo no es un buen consejo.
Shadow
204

Esto es causado por el STRICT_TRANS_TABLESmodo SQL definido en el

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

expediente. Eliminar esa configuración y reiniciar MySQL debería solucionar el problema.

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

Si editar ese archivo no soluciona el problema, consulte http://dev.mysql.com/doc/refman/5.6/en/option-files.html para conocer otras posibles ubicaciones de los archivos de configuración.

Phyxx
fuente
5
Puede ejecutar una consulta SQL dentro de su herramienta de administración de base de datos, como phpMyAdmin: -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria
5
pero tal vez quieras STRICT_TRANS_TABLES?
Andrew
en mi caso, el campo es de tipo DATETIME con el valor predeterminado establecido como NULL, y sigo viendo el mismo error, tengo dos esquemas en la misma base de datos. uno para Staging, otro para producción, con las mismas estructuras de mesa. Funciona en un esquema, pero no funciona en otro con exactamente la misma estructura de tabla en ambos. Estoy desconcertado ... No estoy seguro de que sea un problema con STRICT_TRANS_TABLES
dresh
1
Eliminé STRICT_TRANS_TABLES de /etc/my.cnf, en la línea que comienza con sql_mode, y reinicié el servicio mysql y el problema desapareció.
Mike Volmar
92

Abra phpmyadmin y vaya a la pestaña 'Más' y seleccione el submenú 'Variables'. Desplácese hacia abajo para encontrar el modo SQL. Edite el modo sql y elimine 'STRICT_TRANS_TABLES' Guárdelo.

Nilesh Dhangare
fuente
22
Esta pregunta es sobre MySQL y no menciona phpmyadmin. Por favor, no asuma que todo el mundo lo tiene funcionando.
Chris
2
@ jackadams49 Este cambio no se mantiene. ¿Puede aconsejarme qué hizo para que este cambio sobreviva al reinicio del sistema?
LD James
8
@ jackadams49 para que permanezca, sudo nano /etc/mysql/my.cnfagregar [mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", guardar y salir, y reiniciar mysql sudo service mysql restart
maan81
1
Para agregar, tuve que cambiar los valores de sql_modea nulo, es decir, sql_mode = ""para otros errores similares.
maan81
Recientemente hemos actualizado nuestro MySQL a 5.7. Nos enfrentábamos a demasiados problemas. Esto funcionó para mí. Salvó mi día.
Alumno
38

En phpmyadmin, realice lo siguiente:

select @@GLOBAL.sql_mode

En mi caso, obtengo lo siguiente:

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 y elimínelo STRICT_TRANS_TABLES. Luego realice lo siguiente:

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
fuente
ya, pero para eso, deberá iniciar sesión en phpmyadmin con una cuenta de root :)
supercuenta
1
después de pasar cuatro horas, esta solución funcionó para mí en Ubuntu 16.04. Excelente !
Waleed Ahmed
3
no necesita phpmyadminnada, use estos comandos en la mysqllínea de comandos.
gustyaquino
4
esto se restablecerá a los valores predeterminados después de reiniciar mysql / server / pc. Necesita editar /etc/mysql/mysql.conf.d/mysqld.cnf, y después de [mysqld] agregue esta línea: sql_mode = 'ONLY_FULL_GROUP_BY, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_, NO_BATEY_USZINE'
NO.
solución de @ waza123, esta me funciona después de actualizar a mysql 5.7.20. gracias
Fredy Kardian
28

Cuando tuve este mismo problema con mysql5.6.20 instalado con Homebrew, lo resolví yendo a my.cnf

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

Encuentra la línea que se ve así:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

Comente la línea anterior y reinicie el servidor mysql

mysql.server restart

¡Error desaparecido!

Kingsley Ijomah
fuente
15

Ejecute la consola mysql:

mysql -u your_username -p

, seleccione base de datos:

USE your_database;

y ejecutar (también desde la consola mysql):

SET GLOBAL sql_mode='';

Eso desactivará el modo estricto y mysql no se quejará más.

Para aclarar las cosas: la definición de su base de datos dice "este campo debe tener un valor predeterminado definido", y al realizar los pasos anteriores le dice a MySql "neah, simplemente ignórelo". Entonces, si solo desea hacer una solución rápida localmente, esta solución está bien. Pero generalmente debe investigar en la definición de su base de datos y verificar si el campo realmente necesita un valor predeterminado y, si es así, configurarlo. Y si el valor predeterminado no es necesario, este requisito debe eliminarse para tener una situación limpia.

MilánG
fuente
Sí, no agregue un valor predeterminado, simplemente elimine las reglas, gran solución (sarcasmo implícito) nunca haga esto como un gran mal ejemplo. Sin embargo, resuelve el problema
zardilior
1
Sí, de acuerdo contigo. Pero en algún momento tienes el proyecto de otras personas, que está funcionando bien, es decir, en producción (donde el modo estricto no está configurado) y solo quieres agregar alguna pequeña característica o corrección de errores, trabajando localmente. No quieres luchar contra los dragones, solo para que esa maldita cosa funcione. :)
MilanG
para ese escenario estoy de acuerdo
zardilior
@zardilior ¿cuál es el problema? el valor predeterminado se elige en función del tipo de columna si se elimina la regla. No veo nada malo en ello: / esa regla es bastante severa sin ningún motivo.
Reloecc
1
No es nada severo, solo te obliga a declarar un valor predeterminado o proporcionar un valor, también el modo estricto funciona para muchas más cosas que solo eso, por lo que deshabilitarlo, en lugar de declarar un valor predeterminado en la columna o pasar el valor, es realmente terrible mor ein prod. Desactivas una de las buenas características de mysql allí
zardilior
13

Como dijeron otros, esto es causado por el STRICT_TRANS_TABLESmodo SQL.

Para comprobar si el STRICT_TRANS_TABLESmodo está habilitado:

SHOW VARIABLES LIKE 'sql_mode';

Para deshabilitar el modo estricto:

SET GLOBAL sql_mode='';
Damjan Pavlica
fuente
Se eliminó manualmente "STRICT_TRANS_TABLES" de variables> sql_mode para probar y funcionó.
Prem popatia
1
Salvaste mi día.
umarbilal
Para mí, después de ejecutar el segundo comando y verificar sql_mode (primer comando), no hace nada. Incluso después de reiniciar el servicio mysql. Debian 9
trainoasis
12

Antes de cada acción de inserción, agregué la siguiente línea y resolví mi problema,

SET SQL_MODE = '';

No estoy seguro de si esta es la mejor solución,

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Vinith
fuente
1
No es necesario hacer eso antes de cada acción de inserción, solo hágalo una vez al comienzo de su script, justo después de conectarse a la base de datos, y cada consulta de inserción funcionará sin el error "El campo no tiene un valor predeterminado".
José Carlos PHP
Esta solución está bien porque no es necesario modificar las tablas (puede haber muchos campos para cambiar).
José Carlos PHP
11

Su trabajo y probado Copiar al archivo de configuración: /etc/mysql/my.cnf O /bin/mysql/my.ini

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

luego reinicia MySQL

Devraj Gupta
fuente
9

Modifica tu consulta y agrega "IGNORAR" como:

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Rohit Dhiman
fuente
esto funcionó para mí: mi script PHP se abortaría, pero con IGNORE, ¡solo anuncia una nueva fila! Ahora, ¿qué tan "seguro" es tener IGNORE codificado en una consulta PHP-MYSQL? Lo uso para agregar filas automáticamente, para el nuevo "día", donde no existía antes
Levchik
@Levchik Cuando usa IGNORE, en lugar de un error, MySQL emite una advertencia cuando ocurre un error, e intentará completar la instrucción de alguna manera: mysqltutorial.org/mysql-insert-ignore
Stefan
6

Para Windows WampServer usuarios de :

WAMP> MySQL> my.ini

archivo de búsqueda para sql-mode=""

Descomentarlo.

Andrés
fuente
2
En mi versión tuve que cambiar: 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"a sql-mode="". Dejar de comentar sql-mode=""provocó el error.
Juliano
5

Esto parece ser causado por un error de larga data (desde 2004) (# 6295) en MySQL , titulado

Los disparadores no se procesan para columnas NOT NULL .

Supuestamente se corrigió en la versión 5.7.1 de MySQL (Changelog, última entrada) en 2013, haciendo que MySQL se comporte "según el estándar SQL" (ibid).

B98
fuente
Actualicé de 5.6 a 5.7.11 y el problema se solucionó para mí (y la eliminación de STRICT_TRANS_TABLES no funcionó para mí), así que estoy votando a favor y en contra del resto de respuestas
knocte
5
@knocte No todos pueden actualizar MySQL en su sistema, por lo que no vale la pena votar a favor de esto.
JulienD
La única respuesta que realmente me ayuda. Eliminar la NOT NULLrestricción o agregar un valor predeterminado a la columna solucionó el problema. Trigger funciona como se esperaba.
Ruslan Stelmachenko
3

En Windows Server, edite my.ini (por ejemplo, archivos de programa \ mysql \ mysql server nn \ my.ini)

Yo no simplemente establecería sql-mode = "", más bien sugiero que uno elimine STRICT_TRANS_TABLES de la línea, deje todo como estaba y luego reinicie MySQL desde la utilidad de servicios. Agrega un comentario para futuros programadores sobre quién eres y qué hiciste.

Bill Degnan
fuente
Esta respuesta dice lo mismo. stackoverflow.com/a/52004654/10431118
karma4917
En términos generales, sí, pero mi punto es que estoy diciendo específicamente que no borre todos los valores del modo sql, sino que elimine solo STRICT_TRANS_TABLES, ya que eso es todo lo que necesita. De lo contrario, podría afectar a algún otro servicio.
Bill Degnan
1

configuré los campos en no nulos y el problema se resolvió, se actualiza cuando se ordena que se almacene una información en él, ya no se muestra el mensaje msqli de que el campo estaba vacío porque no insertó un valor en él, la aplicación de esta solución puede funcionar en algunos proyectos depende de la estructura de su proyecto.

ExploreTech
fuente
Resolvió mi error modificando el defaultatributo de la columna de nonea NULL. ¡A menos que haya respuestas de alta calificación! mi cPanel me estaba dando acceso denegado en alojamiento compartido cuando intenté actualizar la variable sql_mode.
Rashid
0

Resolví el problema al cambiar el archivo my.ini ubicado en la carpeta de datos. para mysql 5.6, el archivo my.ini se movió a la carpeta de datos en lugar de la carpeta de instalación bin o mysql.

sadik keskin
fuente
0

Creo que la columna de nombre tiene valores nulos en este caso.

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