143 votes

ERREUR 1067 (42000) : Valeur par défaut non valide pour 'created_at'.

Lorsque j'ai essayé de modifier la table, l'erreur suivante s'est produite :

ERROR 1067 (42000): Invalid default value for 'created_at'

J'ai cherché cette erreur sur Google, mais tout ce que j'ai trouvé, c'est qu'ils avaient essayé de modifier l'horodatage pour qu'elle se produise. Cependant, ici, j'essaie d'ajouter une nouvelle colonne et j'obtiens cette erreur :

mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'

et les deux dernières colonnes de ma table sont created_at et updated_at .

Voici la structure de ma table :

enter image description here

0 votes

Quelles sont les valeurs par défaut de ces colonnes ? Pouvez-vous partager la structure de la table ?

0 votes

@Priyanshu J'ai mis à jour la structure de ma table.

2 votes

Définir la valeur par défaut current_timestamp pour les deux dernières colonnes.

218voto

Aman Aggarwal Points 5608

Le problème est dû à sql_modes . Veuillez vérifier vos sql_modes actuels par commande :

show variables like 'sql_mode' ; 

Et supprimez le sql_mode " NO_ZERO_IN_DATE,NO_ZERO_DATE "pour le faire fonctionner. C'est le sql_mode par défaut dans les nouvelles versions de mysql.

Vous pouvez définir sql_mode globalement comme Root par commande :

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

7 votes

Je sais cela, mais dans mon serveur, sql_mode montre un blanc, et ne fonctionne toujours pas, j'utilise [Server version : 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)]. Quelqu'un peut-il avoir une solution sans mettre à niveau la version du serveur ?

0 votes

Avez-vous vérifié par la commande globale ? et n'y a-t-il rien dans sql_mode pour la même session ?

0 votes

J'ai vérifié l'affichage de variables comme 'sql_mode' ; et la sortie est Nom_de_variable|Valeur = sql_mode|.

126voto

Ahmed Mohamed Points 537

Simplement, avant d'exécuter toute déclaration, mettez ceci dans la première ligne :

SET sql_mode = '';

VEUILLEZ NOTER : cette déclaration doit être utilisée uniquement en développement, et non en production.

8 votes

Merci pour le tuyau. Mais seulement la suppression des restrictions de date NO_ZERO_IN_DATE,NO_ZERO_DATE nous permet uniquement de maintenir d'autres fonctions de sécurité : SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_B‌​Y_ZERO,NO_AUTO_CREAT‌​E_USER,NO_ENGINE_SUB‌​STITUTION';

2 votes

À titre de précision, cette déclaration ne doit être utilisée qu'en développement, et non en production.

38voto

mlaferla Points 714

Essayez et exécutez la commande suivante :

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

et

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

La raison pour laquelle vous obtenez cette erreur est que vous ne définissez pas de valeur par défaut pour l'option created_at et updated_at champs. MySQL n'accepte pas votre commande car les valeurs de ces colonnes ne peuvent pas être nulles.

32voto

Martin Mohan Points 809

Je suis tombé sur la même erreur en essayant d'installer une base de données tierce. J'ai essayé sans succès la solution proposée, à savoir
SET sql_mode = '';

Puis j'ai essayé la commande ci-dessous qui a fonctionné permettant l'installation de la base de données.
SET GLOBAL sql_mode = '';

2 votes

SET sql_mode = ''; est maintenant déprécié, SET GLOBAL sql_mode = '' est OK

9voto

Tomás Points 49

Dans mon cas, j'ai un fichier à importer.
J'ai donc simplement ajouté SET sql_mode = ''; au début du fichier et ça marche !

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