78 votes

Comment forcer MySQL à prendre 0 comme valeur d'auto-incrémentation valide

Longue histoire courte, j'ai un fichier SQL que je veux importer en tant que skel fichier de style, de sorte que ce sera fait à plusieurs reprises, par programmation. Je peux modifier le fichier SQL cependant je veux, mais je préfère ne pas toucher à l'application elle-même.

Cette application utilise userid = 0 pour représenter l'utilisateur anonyme. Il dispose également d'un pertinent (vide) entrée dans la base de données pour représenter cet "utilisateur". Par conséquent, la ligne dans mon skel.sql ressemble à quelque chose comme ceci:

INSERT INTO `{{TABLE_PREFIX}}users` VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);

Le problème, c'est qu' uid est auto_increment champ, pour qui, techniquement, 0 est une valeur non valide. Ou au moins, si vous le réglez à 0, vous êtes essentiellement en disant MySQL, "Veuillez insérer le numéro suivant dans ce domaine."

Maintenant, je suppose que je pourrais mettre un INSERT puis un UPDATE de la requête dans mon fichier SQL, mais est-il une façon de dire à MySQL en général que oui, je veux insérer 0 dans ce domaine?

97voto

Matthew Scharley Points 43262

À partir de la réponse que j'ai ici:

Vous pouvez utiliser:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

Qui est décrit ici, permettra d'éviter de MySQL à partir de l'interprétation d'une INSERTION/mise à JOUR de l'ID de 0 comme étant la prochaine séquence ID. Un tel comportement sera limitée à la valeur NULL.

C'est ce que je considère assez mauvais comportement de l'application. Vous devez être vraiment prudent qu'il est utilisé régulièrement, surtout si vous choisissez de mettre en œuvre la réplication à une date ultérieure.

27voto

I.G. Pascual Points 1428

Vérifiez votre sql DB mode:

SELECT @@[GLOBAL|SESSION].sql_mode;

Si elle est vide ou pas, utilisez:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

ATTENTION! Si vous utilisez GLOBAL, il n'est pas immédiats du changement, vous devez redémarrer votre connexion pour appliquer le réglage.

Donc, si vous êtes de la restauration de données à partir d'un DB à un autre, par exemple, et vous ne savez pas si ce paramètre est appliqué, utilisez SESSION pour un immédiats du changement (mise à zéro lors de la fermeture de la connexion). Lorsque vous avez terminé, insérez une valeur de 0 et qu'il ne changera pas, même si l' sql_mode est changé.

Pour réinitialiser ce mode (et autres?)

SET [GLOBAL|SESSION] sql_mode=''

Zéro autoincrement valeurs ne sont pas recommandés pour être utilisés, car elle n'est pas définie par défaut dans les bases de données mysql.

Pour plus d'informations, consultez mysql dev page sujet sur ce

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