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

113

Ma table ressemble à

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

puis 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();

Quand je fais une insertion en utilisant

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

l'entrée est faite dans le tableau mais j'obtiens 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 hibernation verra ces exceptions (même si les insertions ont été faites) et l'application se plantera.

kk1957
la source

Réponses:

28

Définissez une valeur par défaut pour Created_By(par exemple: vide VARCHAR) et le déclencheur mettra à jour la valeur de toute façon.

create table try ( 
     name varchar(8), 
     CREATED_BY varchar(40) DEFAULT '' not null
);
KinSlayerUY
la source
Comment définir une valeur par défaut dans un programme Java?
Nagarajan Shanmuganathan
1
vous avez besoin d'une valeur par défaut dans la définition de la table (create table try (name varchar (8), CREATED_BY varchar (40) DEFAULT '' not null))
KinSlayerUY
Cela ne résout pas le problème racine. Voir la réponse beaucoup plus complète de Phyxx ci-dessous.
csvan
3
La réponse de @csvan Phyxx n'aborde pas la cause première non plus parce que la cause principale était un bogue dans MySQL qui a été corrigé dans la v5.7.1 - voir la réponse de B98: stackoverflow.com/a/29854279/5389997 La suppression du mode sql strict_trans_table rend MySQL plus sujettes à des erreurs de qualité des données, leur suppression n'est donc pas un très bon conseil.
Shadow
205

Cela est dû au STRICT_TRANS_TABLESmode SQL défini dans le

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

fichier. La suppression de ce paramètre et le redémarrage de MySQL devraient résoudre le problème.

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

Si l'édition de ce fichier ne résout pas le problème, voir http://dev.mysql.com/doc/refman/5.6/en/option-files.html pour d'autres emplacements possibles des fichiers de configuration.

Phyxx
la source
5
Vous pouvez exécuter une requête SQL dans votre outil de gestion de base de données, tel que phpMyAdmin: -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria
5
mais peut-être voulez-vous STRICT_TRANS_TABLES?
Andrew
dans mon cas, le champ est de type DATETIME avec la valeur par défaut NULL, et je vois toujours la même erreur, j'ai deux schémas sur la même base de données. un pour la mise en scène, un autre pour la production, avec les mêmes structures de table. Cela fonctionne dans un schéma, mais ne fonctionne pas dans un autre avec exactement la même structure de table dans les deux. Je suis déconcerté .. Je ne suis pas sûr que ce soit un problème avec STRICT_TRANS_TABLES
dresh le
1
J'ai supprimé STRICT_TRANS_TABLES de /etc/my.cnf - dans la ligne commençant par sql_mode - et redémarré le service mysql et le problème a disparu.
Mike Volmar
92

Ouvrez phpmyadmin et accédez à l'onglet «Plus» et sélectionnez le sous-menu «Variables». Faites défiler vers le bas pour trouver le mode SQL. Modifiez le mode SQL et supprimez 'STRICT_TRANS_TABLES' Enregistrez-le.

Nilesh Dhangare
la source
22
Cette question concerne MySQL et ne fait aucune mention de phpmyadmin. S'il vous plaît, ne supposez pas que tout le monde fonctionne.
Chris
2
@ jackadams49 Ce changement ne tient pas. Pouvez-vous me dire ce que vous avez fait pour que ce changement survienne au redémarrage du système?
LD James
8
@ jackadams49 pour que ça reste sudo nano /etc/mysql/my.cnf, ajoutez[mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" , enregistrer et quitter, et redémarrer mysql sudo service mysql restart
maan81
1
Pour ajouter, j'ai dû changer les valeurs de sql_modeen null, c'est- sql_mode = ""à- dire pour d'autres erreurs similaires.
maan81
Nous avons récemment mis à jour notre MySQL vers 5.7. Nous étions confrontés à trop de problèmes. Cela a fonctionné pour moi. J'ai sauvé ma journée.
Élève
38

Dans phpmyadmin, procédez comme suit:

select @@GLOBAL.sql_mode

Dans mon cas, j'obtiens ce qui suit:

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

Copiez ce résultat et supprimez STRICT_TRANS_TABLES . Ensuite, procédez comme suit:

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
la source
ya mais pour cela, vous devrez vous connecter à phpmyadmin avec un compte root :) super compte
user889030
1
après avoir passé quatre heures, cette solution a fonctionné pour moi dans Ubuntu 16.04. Génial !
Waleed Ahmed
3
vous n'avez pas besoin phpmyadmindu tout, utilisez ces commandes sur la mysqlligne de commande.
gustyaquino
4
cela sera réinitialisé à la valeur par défaut après le redémarrage de mysql / serveur / pc. Vous devez modifier /etc/mysql/mysql.conf.d/mysqld.cnf, et après [mysqld] ajoutez cette ligne: 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
solution par @ waza123, celle-ci fonctionne pour moi après la mise à niveau vers mysql 5.7.20. merci
fredy kardian
28

Quand j'ai eu ce même problème avec mysql5.6.20 installé avec Homebrew, je l'ai résolu en allant dans my.cnf

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

Trouvez la ligne qui ressemble à ceci:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

Commentez ci-dessus et redémarrez le serveur mysql

mysql.server restart

Erreur partie!

Kingsley Ijomah
la source
15

Exécutez la console mysql:

mysql -u your_username -p

, sélectionnez la base de données:

USE your_database;

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

SET GLOBAL sql_mode='';

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

Pour clarifier les choses: la définition de votre 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 "non, ignorez-le". Donc, si vous voulez juste faire une solution rapide localement, cette solution est correcte. Mais en général, vous devriez rechercher dans la définition de votre base de données et vérifier si le champ a vraiment besoin de la valeur par défaut et si c'est le cas, définissez-le. Et si la valeur par défaut n'est pas nécessaire, cette exigence doit être supprimée pour avoir une situation propre.

MilanG
la source
Ouais, n'ajoutez pas de valeur par défaut, supprimez simplement les règles, une excellente solution (sarcasme implicite) ne faites jamais un très mauvais exemple. Cela résout le problème
zardilior
1
Ouais, d'accord avec toi. Mais parfois, vous avez le projet de quelqu'un d'autre, qui fonctionne bien, c'est-à-dire en production (où le mode strict n'est pas défini) et vous voulez juste ajouter une petite fonctionnalité ou une correction de bogue, fonctionnant en local. Vous ne voulez pas combattre les dragons, juste pour que ça marche. :)
MilanG
pour ce scénario, je suis d'accord
zardilior
@zardilior quel est le problème? la valeur par défaut est choisie en fonction du type de colonne si la règle est supprimée. Je n'y vois rien de mal: / cette règle est assez dure sans raison.
Reloecc le
1
Pas dur du tout, cela vous oblige simplement à déclarer une valeur par défaut ou à fournir une valeur, le mode strict fonctionne également pour beaucoup plus de choses que cela, donc le désactiver, au lieu de déclarer un sourd sur la colonne ou de passer la valeur, est vraiment terrible mor ein prod. Vous désactivez l'un des bons caractères mysql là
zardilior
13

Comme d'autres l'ont dit, cela est dû au STRICT_TRANS_TABLESmode SQL.

Pour vérifier si le STRICT_TRANS_TABLESmode est activé:

SHOW VARIABLES LIKE 'sql_mode';

Pour désactiver le mode strict:

SET GLOBAL sql_mode='';
Damjan Pavlica
la source
Supprimé manuellement "STRICT_TRANS_TABLES" des variables> sql_mode pour les tests et cela a fonctionné!
Prem popatia le
1
Tu as sauvé ma journée.
umarbilal
Pour moi, après avoir exécuté la deuxième commande et vérifié sql_mode (1ère commande), cela ne fait rien. Même après avoir redémarré le service mysql. Debian 9
trainoasis
12

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

SET SQL_MODE = '';

Je ne sais pas si c'est la meilleure solution,

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Vinith
la source
1
Il n'est pas nécessaire de le faire avant chaque action d'insertion, faites-le juste une fois au début de votre script, juste après la connexion à la base de données, et chaque requête d'insertion fonctionnera sans l'erreur «Le champ n'a pas de valeur par défaut».
José Carlos PHP
Cette solution convient car vous n'avez pas besoin de modifier les tables (il peut y avoir beaucoup de champs à modifier).
José Carlos PHP
11

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

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

puis redémarrez MySQL

Devraj Gupta
la source
9

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

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Rohit Dhiman
la source
cela a fonctionné pour moi - mon script PHP serait abandonné, mais avec IGNORE, il ajoute juste une nouvelle ligne! Maintenant, à quel point est-il "sûr" d'avoir IGNORE codé en dur dans une requête PHP-MYSQL? J'utilise ceci pour ajouter automatiquement des lignes, pour le nouveau "jour", là où il n'existait pas auparavant
Levchik
@Levchik Lorsque vous utilisez IGNORE, au lieu d'une erreur, MySQL émet un avertissement lorsqu'une erreur se produit, à la place, et essaiera de terminer l'instruction d'une manière ou d'une autre: mysqltutorial.org/mysql-insert-ignore
Stefan
6

Pour les utilisateurs de Windows WampServer :

WAMP> MySQL> my.ini

rechercher un fichier pour sql-mode=""

Décommentez-le.

Andrew
la source
2
Dans ma version, j'ai dû changer: 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"en sql-mode="". Le sql-mode=""fait de ne pas commenter a causé l'erreur.
Julian
5

Cela semble être causé par un bogue de longue date (depuis 2004) (# 6295) dans MySQL , intitulé

Les déclencheurs ne sont pas traités pour les colonnes NOT NULL .

Il aurait été corrigé dans la version 5.7.1 de MySQL (Changelog, dernière entrée) en 2013, ce qui fait que MySQL se comporte «selon la norme SQL» (ibid).

B98
la source
J'ai mis à jour la version 5.6 vers la version 5.7.11 et le problème a été résolu pour moi (et la suppression de STRICT_TRANS_TABLES n'a pas fonctionné pour moi), donc je vote pour cela et je vote contre le reste des réponses
knocte
5
@knocte Tout le monde ne peut pas mettre à jour MySQL sur son système, il ne vaut donc pas la peine de voter en faveur de cela.
JulienD
La seule réponse qui m'aide vraiment. SuppressionNOT NULL contrainte ou l'ajout de la valeur par défaut à la colonne a résolu le problème. Le déclencheur fonctionne comme prévu.
Ruslan Stelmachenko
3

Dans Windows Server, modifiez my.ini (par exemple, program files \ mysql \ mysql server nn \ my.ini)

Je ne définirais pas simplement le sql-mode = "", je suggère plutôt de supprimer STRICT_TRANS_TABLES de la ligne, de tout laisser tel quel, puis de redémarrer MySQL à partir de l'utilitaire de services. Ajoutez un commentaire pour les futurs programmeurs qui vous êtes et ce que vous avez fait.

Bill Degnan
la source
Cette réponse dit la même chose. stackoverflow.com/a/52004654/10431118
karma4917
En général, oui, mais mon point est que je dis spécifiquement de ne pas effacer toutes les valeurs de sql-mode, mais plutôt de supprimer uniquement STRICT_TRANS_TABLES, car c'est tout ce dont vous avez besoin. Sinon, vous pourriez avoir un impact sur un autre service.
Bill Degnan
1

J'ai défini les champs sur non null et le problème est résolu, il se met à jour quand une information est commandée pour y stocker, plus aucun message msqli indiquant que le champ était vide car vous ne lui avez pas inséré de valeur, bien l'application de cette solution peut fonctionner sur certains les projets dépendent de la structure de votre projet.

Explorez la technologie
la source
Cela a résolu mon erreur en modifiant l' defaultattribut de la colonne de noneà NULL. À moins de réponses de bonne qualité! mon cPanel me donnait l'accès refusé sur l'hébergement partagé lorsque j'ai essayé de mettre à jour la variable sql_mode.
Rashid
0

J'ai résolu le problème en changeant le fichier my.ini situé dans le dossier de données. pour mysql 5.6, le fichier my.ini a été déplacé dans le dossier data plutôt que dans le dossier d'installation bin ou mysql.

Sadik Keskin
la source
0

Je pense que dans la colonne de nom ont des valeurs nulles dans ce cas.

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