136 votes

mysql error 1364 Le champ n'a pas de valeurs par défaut

Mon tableau ressemble à

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

et ensuite j'ai un déclencheur pour remplir automatiquement le champ CREATED_BY

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

Lorsque je fais une insertion en utilisant

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

l'entrée est faite dans le tableau mais je reçois toujours le message d'erreur

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

Existe-t-il un moyen de supprimer cette erreur sans rendre le champ nullable ET sans supprimer le déclencheur ? Sinon, mon hibernate verra ces exceptions (même si les insertions ont été faites) et l'application se plantera.

25voto

MilanG Points 121

Lancez la console mysql :

mysql -u your_username -p

sélectionnez la base de données :

USE your_database;

et exécuter (également à partir de la console mysql) :

SET GLOBAL sql_mode='';

Cela désactivera le mode strict et mysql ne se plaindra plus.

Pour que les choses soient claires : votre définition de base de données dit "ce champ doit avoir une valeur par défaut définie", et en faisant les étapes ci-dessus, vous dites à MySql "neah, ignorez-le". Donc si vous voulez juste faire une correction rapide localement, cette solution est acceptable. Mais, en général, vous devriez examiner la définition de votre base de données et vérifier si le champ a vraiment besoin d'une valeur par défaut et, si oui, la définir. Et si la valeur par défaut n'est pas nécessaire, cette exigence devrait être supprimée pour avoir une situation propre.

15voto

Damjan Pavlica Points 7299

Comme d'autres l'ont dit, cela est dû à la STRICT_TRANS_TABLES Mode SQL.

Pour vérifier si STRICT_TRANS_TABLES est activé :

SHOW VARIABLES LIKE 'sql_mode';

Pour désactiver le mode strict :

SET GLOBAL sql_mode='';

14voto

Vinith Points 1010

Avant chaque action d'insertion, j'ai ajouté la ligne ci-dessous et j'ai résolu mon problème,

SET SQL_MODE = '';

Je ne suis pas sûr que ce soit la meilleure solution,

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

13voto

Rohit Dhiman Points 41

Modifiez votre requête et ajoutez "IGNORE" comme :

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

12voto

Devraj Gupta Points 174

Son travail et testé Copie au fichier de configuration : /etc/mysql/my.cnf OU /bin/mysql/my.ini

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

puis redémarrez MySQL

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X