2010-10-16 11 views
0

id clé primaire Comment cherchez-vous une suppression numéro d'identification qui a été utilisé, mais également supprimés ne sont plus utilisés, avant vous ajoutez juste au-dessus du dernier numéro d'identification qui a été ajoutémysql incrémentation automatique de

Par exemple:

ID  Name 

    1  Orange 
    5  Apple 

J'ai incrémentation automatique, je veux ajouter Banana au numéro 2, mais incrémentation automatique ajoute comme ID 6

+0

Y a-t-il une raison particulière pour laquelle vous n'avez besoin d'aucun espace dans la séquence? – Randy

Répondre

0

C'est exactement comme ça que fonctionne auto-inc.

Si vous utilisez MySQL, je pense qu'il a quelque chose de intégré qui fait cela pour vous, mais je peux me tromper puisque je ne le trouve pas dans la documentation.

Vous pouvez également écrire un script vous-même. Ce sera un script assez intense sur le serveur Web et le serveur de base de données, donc il ne devrait pas être exécuté trop souvent.

Auto-inc a fonctionné de la même manière pendant des années. C'est évidemment faire quelque chose de bien. Sauf si vous avez une raison particulière de ne pas vouloir de lacunes dans vos clés primaires (et même alors, vous devriez sérieusement reconsidérer ce que vous utilisez le champ pour), laissez-le être. Si le champ est int 10 et non signé, vous aurez beaucoup de de salle de manœuvre ...

+0

Intéressant, alors ne vous inquiétez pas à ce sujet vous dites ... – TobyJones

+0

bravo pour votre réponse – TobyJones

+0

Je ne voudrais pas. Aller avec INT (10) UNSIGNED sur le champ auto-inc vous donnera 4 294 967 295 incréments automatiques à jouer avec. Une fois que vous commencez à approcher ce nombre, vous pouvez écrire un script de maintenance pour passer et exécuter la tâche. –

1

C'est juste pas comment fonctionne l'auto-augmentation.

Je suis presque certain que vous devrez trouver des identifiants manquants et les assigner vous-même.

Vous voudrez peut-être étiqueter de nouveau votre question pour inclure la base de données que vous utilisez. Je suppose MySql?

+0

voulez-vous dire avoir le code pour rechercher le prochain numéro d'identification disponible? ou manuellement le faire (ce qui serait mauvais parce que c'est une base de données assez longue) – TobyJones

0

Vous devrez écrire votre propre code pour identifier l'identificateur inutilisé le plus bas et l'affecter manuellement dans votre requête INSERT. Votre colonne AUTO_INCREMENT fonctionne correctement, elle ne réutilisera pas les identifiants supprimés.

+0

bravo, merci pour votre réponse – TobyJones

0

Banana ayant un ID de 6 est correct - cela fonctionne comme prévu. Tout l'auto-incrémentation vous permet d'insérer de nouvelles lignes dans la table sans connaître l'ID précédent. Fondamentalement, vous permet d'insérer des données sans vous soucier d'écraser l'ID, et vous pouvez être paresseux.

Le mode d'incrémentation automatique fonctionne avec un compteur qui augmente pour chaque ligne insérée. Lorsque vous supprimez des lignes, le compteur ne change pas.

Je pense que ce que vous attendez, c'est que la base de données se déplace automatiquement vers le bas des lignes pour remplir les ID manquants. Bien que cela puisse être vrai dans une structure de données de liste chaînée, ce n'est pas le cas dans ce cas. La seule façon de combler ces lacunes est de le faire manuellement ou d'écrire un script qui comblerait les lacunes ou réorganiserait la table ou les identifiants. Cependant, cela n'est pas vraiment nécessaire, car lorsque vous récupérez les lignes à des fins de balisage, vous pouvez utiliser une liste ordonnée ou une boucle triviale pour gérer cela, et les écarts seraient tout simplement non pertinents.

+0

Merci, ouais je pense que j'aime juste voir tout dans un ordre parfait haha, eh bien je suppose que ça n'a pas d'importance, – TobyJones

1

Je pense que généralement la fonctionnalité d'incrémentation automatique est utilisée pour créer une clé unique sur les tables et que la réutilisation de la clé unique n'est pas l'utilisation normale de la clé, car supprimer un enregistrement et en insérer un t signifie nécessairement que l'enregistrement inséré est le même que celui qui a été supprimé. c'est-à-dire que la clé ne serait pas réellement "unique" au sens intuitif du fait que deux lignes ont partagé cette clé, même si, techniquement, il n'y aurait pas de contraintes de clés uniques qui soient rompues.

Veuillez noter qu'avec votre propre implémentation vous devez vous soucier des problèmes de simultanéité. 1) l'utilisateur A veut insérer donc cherche l'ID disponible le plus bas
2) l'utilisateur B veut insérer donc recherche l'ID disponible le plus bas
3) utilisateur A trouve l'ID disponible le plus bas de 2
4) l'utilisateur B trouve l'ID disponible le plus bas de 2
5) l'utilisateur A insère une ligne et utilise l'ID 2
6) l'utilisateur B insère une ligne et essaie d'utiliser l'ID 2 et réussit (ce qui rend la clé n'est plus unique) ou échoue parce que l'ID 2 a déjà été utilisé.

Quelle est l'utilisation prévue?

+0

Voilà, bon point, cela a beaucoup de sens, c'est juste pour un projet d'école – TobyJones

0

Ok, j'ai une réponse. Mais si vous l'utilisez, je vais venir vous battre! Cette sous-requête trouvera le trou le plus bas dans les identifiants. Remplacez simplement le mot table par le nom de votre table.

INSERT INTO 
    table 
SET 
    id = (
     SELECT 
      MIN(a.id + 1) 
     FROM 
      table a 
      LEFT JOIN table b 
       ON a.id + 1 = b.id 
     WHERE 
      b.id IS NULL 
    ), 
    name = 'next'