Ma table ressemble
create table try ( name varchar(8), CREATED_BY varchar(40) not null);
et 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 un insert en utilisant
insert into try (name) values ('abc');
l'entrée est faite dans la table 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 AND sans supprimer le déclencheur? Sinon, mon hibernate verra ces exceptions (même si les insertions ont été faites) et l'application se bloquera.
Définissez une valeur par défaut pour Created_By
(par exemple: empty VARCHAR
) et le déclencheur mettra à jour la valeur quand même.
Ceci est dû au mode SQL STRICT_TRANS_TABLES
défini dans le
% PROGRAMDATA%\MySQL\MySQL Server 5.6\my.ini
fichier. Supprimer ce paramètre et redémarrer MySQL devrait résoudre le problème.
Si la modification de ce fichier ne résout pas le problème, voir http://dev.mysql.com/doc/refman/5.6/en/option-files.html pour connaître les autres emplacements possibles des fichiers de configuration.
Ouvrez phpmyadmin et allez sur 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.
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 au-dessus de la ligne et redémarrez le serveur mysql
mysql.server restart
Erreur parti!
Dans phpmyadmin, procédez comme suit:
select @@GLOBAL.sql_mode
Dans mon cas, je reçois 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
. Puis effectuez les opérations suivantes:
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'
Avant chaque action d'insertion, j'ai ajouté ci-dessous la ligne et 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');
Son travail et testé Copier dans le fichier de configuration: /etc/mysql/my.cnf OR /bin/mysql/my.ini
[mysqld]
port = 3306
sql-mode=""
puis redémarrez MySQL
Pour Windows WampServer utilisateurs:
WAMP> MySQL> my.ini
fichier de recherche pour sql-mode=""
Décommentez-le.
Cela semble être causé par un long-standing (depuis 2004) Un bogue (# 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, faisant en sorte que MySQL se comporte «selon le standard SQL» (ibid.).
Comme d'autres l'ont dit, cela est dû au mode SQL STRICT_TRANS_TABLES
.
Pour vérifier si le mode STRICT_TRANS_TABLES
est activé:
SHOW VARIABLES LIKE 'sql_mode';
Pour désactiver le mode strict:
SET GLOBAL sql_mode='';
Modifiez votre requête et ajoutez "IGNORE" en tant que:
INSERT IGNORE INTO `mytable` ( `field1` , `field2`) VALUES ('value1', 'value2');
Lancer la console mysql:
mysql -u your_username -p
, sélectionnez la base de données:
USE your_database;
et lancez (aussi depuis la console mysql):
SET GLOBAL sql_mode='';
Cela désactivera le mode strict et mysql ne se plaindra plus.
Dans Windows Server, éditez my.ini (par exemple, fichiers de programme\mysql\serveur mysql n.n\my.ini).
Je ne voudrais pas simplement définir 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 depuis l'utilitaire de services. Ajoutez un commentaire pour les futurs programmeurs qui vous êtes et ce que vous avez fait.
j'ai résolu le problème de modification du fichier my.ini situé dans le dossier de données. Pour mysql 5.6, le fichier my.ini a été transféré dans le dossier de données plutôt que dans le dossier d'installation bin ou mysql.
je règle les champs sur null et le problème résolu, il est mis à jour lorsqu’une information est commandée pour y stocker, plus aucun message msqli indiquant que le champ était vide cus vous n’avez pas inséré de valeur, l’application de cette solution peut fonctionner sur certains projets dépend de la structure de votre projet.
Bien qu'il y ait beaucoup de réponses, j'ajouterai le mien… .. J'ai aussi eu cette erreur en essayant d'ajouter un livre à ma table books
.
dans mon cas, le champ nommé issued
a été attribué à INT(10) NOT NULL
. signifie que ce champ était supposé prendre une valeur entière . Je viens de changer la valeur NOT NULL
en as_defined
et la valeur par défaut 0
. et cela a fonctionné pour moi.
Utilisez cette option si vous avez affaire à une valeur entière dans ce champ ou si vous souhaitez effectuer certaines opérations ultérieurement dans la valeur de ce champ.