2010-02-18 8 views
5

J'utilise un serveur MySQL 5.0. Mon exigence est d'ajouter une ligne spéciale à une table existante qui a une clé primaire auto-incrémentée.Puis-je utiliser zéro dans une colonne qui a l'attribut AUTO_INCREMENT

Il serait très utile pour la maintenance et la gestion futures du projet si nous pouvions faire l'id de cette ligne 0 (parce qu'il est facile de se souvenir et facile à repérer dans les observations manuelles). Maintenant, je sais que MySQL n'a aucun problème avec vous en utilisant votre propre valeur pour une colonne auto-incrémentée, et mes tests ont montré que je peux définir la clé primaire autoincrement d'une ligne à 0 avec une requête UPDATE. Cependant, certaines préoccupations ont été soulevées quant à la façon dont cela pourrait affecter la fonctionnalité d'auto-incrémentation de la colonne dans les futures INSERT.

Mes expériences (limitées) n'ont rien montré d'étrange et je ne trouve rien de spécifique contre cela dans les documents MySQL. C'est, en dehors de cette (Souligné par l'auteur): http://dev.mysql.com/doc/refman/5.0/en/create-table.html

Il ne peut y avoir qu'une seule colonne AUTO_INCREMENT, il doit être indexé, et il ne peut pas avoir une valeur par défaut. Une colonne AUTO_INCREMENT ne fonctionne correctement que si elle contient uniquement des valeurs positives. L'insertion d'un nombre négatif est considérée comme l'insertion d'un très grand nombre positif. Ceci est fait pour éviter les problèmes de précision lorsque le nombre « wrap » au-dessus de positif à négatif et aussi pour vous assurer que vous ne recevez pas accidentellement une colonne AUTO_INCREMENT qui contient 0.

Je ne peux pas trouver une explication qu'est-ce qui ne va pas avec une valeur de zéro dans une colonne AUTO_INCREMENT, donc quelqu'un peut-il me dire si avoir une colonne AUTO_INCREMENT qui contient 0 est une mauvaise chose?

Répondre

2

Comme vous l'avez déjà découvert, il n'est pas possible d'attribuer un 0 à un champ d'incrémentation automatique avec un INSERT, vous devez utiliser un UPDATE. AFAIK il n'y a rien de mal à avoir un 0 à la suite sauf quand vous essayez de vider et d'importer. Mais cela peut être évité en insérant d'abord les données puis en les marquant plus tard comme un champ d'incrémentation automatique.

+0

Bon appel sur une réimportation. Je ne l'avais pas envisagé comme nous ne le faisons pas souvent, mais nous en tiendrons compte au cas où nous le ferions. Autant que je sache, il n'y a rien de mal avec 0 dans une colonne d'incrément automatique soit :). Mais cette note que j'ai citée suggère le contraire, alors j'espérais obtenir une réponse qui soit explique pourquoi le manuel de référence dit cela, soit pourquoi cela pourrait être faux. À quel point êtes-vous certain qu'il n'y a rien de mal avec 0 dans une colonne d'incrémentation automatique? –

+0

Je suis assez confiant que tout ira bien. Cette fois, j'ai eu un 0 dans un champ auto-incrémenté en raison d'un bug dans mon code, il n'a eu aucun effet secondaire. – e4c5

1

Le stockage de 0 n'est pas recommandé. Par exemple, si vous videz la table avec mysqldump puis la rechargez, MySQL génère normalement de nouveaux numéros de séquence lorsqu'il rencontre les valeurs 0, ce qui donne une table dont le contenu est différent de celui qui a été sauvegardé. Activer NO_AUTO_VALUE_ON_ZERO avant de recharger le fichier de vidage résout ce problème. mysqldump inclut maintenant automatiquement dans sa sortie une instruction qui permet NO_AUTO_VALUE_ON_ZERO, pour éviter ce problème.