IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Décisions SGBD Discussion :

Théorie: Identifiants auto-incrémentés


Sujet :

Décisions SGBD

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Théorie: Identifiants auto-incrémentés
    Bonjour à tous!

    Je viens avec une question relativement simple. Cependant, je n'ai pas trouvé de réponse après une longue matinée de recherche...peut être allez vous pouvoir m'aider.

    Imaginons que j'aie une table client avec deux champs

    client_id (numéro auto-incrémenté)
    client_nom (chaine de caractères)

    Deux utilisateurs créent un enregistrement dans cette table EN MEME TEMPS.
    La requête est du genre
    insert into client (client_nom) values (nomclient)

    L'identifiant du client est généré automatiquement. La question est de savoir quand exactement est-il créé?

    A- au moment de l'INSERT: auquel cas l'identifiant sera le même dans les deux requêtes.
    B- au moment du COMMIT: auquel cas on ne doit pas se soucier des éventuels doublons.
    C- "Rien de tout ça. T'es vraiment une chèvre en BDD! Casse-toi!!"

    Cela dépend-il des SGBD?

    Comment gérer les éventuels conflits (accès concurrentiels)?

    Voilà.. J'espère avoir été clair.

    Merci d'avance pour vos réponses!

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Bonjour, et bienvenue sur le forum,

    La lecture de cette article te donnera sûrement des éléments de réponses : Clefs auto incrémentées
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    L'affectation de l'identifiant est effectuée au moment de l'INSERT.
    Même si la transaction n'a pas encore été validée (COMMIT), le compteur de l'identifiant pour la table est incrémenté ; ce qui fait qu'en cas de ROLLBACK de la transaction il y a des trous dans la séquence des identifiants.
    Il n'y a pas de risque d'affecter deux fois un identifiant, parce que la notion de EN MEME TEMPS ne s'applique pas : il y aura quand même séquence des opérations.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par al1_24
    Il n'y a pas de risque d'affecter deux fois un identifiant, parce que la notion de EN MEME TEMPS ne s'applique pas : il y aura quand même séquence des opérations.
    Ca contredit l'article précédemment cité...

    Ca nous renvoie à la question: "cela dépend-il des SGBD?".

    J'ai en effet le souvenir d'avoir créé trois enregistrements dans une nouvelle table, les avoir supprimés et avoir créé un nouvel enregistrement (alors seul dans la table) avec l'identifiant 4. C'est la preuve que, sur ce SGBD du moins, un identifiant est unique et n'est pas réattribué (jamais essayé la réindexation).

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par blapointe
    Ca contredit l'article précédemment cité...
    Je ne crois pas, pourquoi ?

    Citation Envoyé par blapointe
    Ca nous renvoie à la question: "cela dépend-il des SGBD?".
    Non : le mécanisme d'attribution de la prochaine clé (séquence ou champ auto) est géré par le serveur de données, dès qu'un programme y fait appel, toute tentative suivante d'appel doit attendre que la précédente ait aboutie : impossible donc d'avoir un doublon à ce niveau.

    Citation Envoyé par blapointe
    J'ai en effet le souvenir d'avoir créé trois enregistrements dans une nouvelle table, les avoir supprimés et avoir créé un nouvel enregistrement (alors seul dans la table) avec l'identifiant 4. C'est la preuve que, sur ce SGBD du moins, un identifiant est unique et n'est pas réattribué (jamais essayé la réindexation).
    C'est normal, le mécanisme pré-cité ne tient pas absoluement pas compte des suppressions, et ne gère donc pas les "trous" : créée 150 enregistrements, supprime-les, le prochain aura un identifiant de 151 ...
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par blapointe
    Ca nous renvoie à la question: "cela dépend-il des SGBD?".
    C'est le SGBD qui gère ses séquences comme il l'entend...
    Exemple : je travaille sur Teradata, SGBD orienté décisionnel et entrepôts de données.
    Depuis la version 5, il prend en charge les identifiants auto-incrémentés définis par la norme ANSI.
    Lors des opérations de chargements de fichiers dans des tables, donc insertion massive d'enregistrements, le SGBD ouvre plusieurs sessions simultanément et affecte à chacune des paquets de lignes, histoire d'optimiser les traitements en utilisant au mieux son architecture massivement parallèle.
    Pour perdre moins de temps à gérer l'identifiant auto-incrémenté, chaque session se voit attribuer une plage d'identifiants au fur et à mesure des besoins.
    A l'arrivée, toutes les lignes sont dans la table, affectées chacune d'un identifiant numérique unique mais dont la valeur n'a aucun rapport avec la position de la ligne dans le fichier source.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Xo
    Je ne crois pas, pourquoi ?
    pour ça :

    "'utilisateur A, procède à l'acquisition d'une clef en vue de saisir les données afférentes à Monsieur Gilles LEBLANC. Il lui est attribué la clef 53 puisque la dernière valeur de clef stockée dans la table MaTable est 52. Quelques instants plus tard, l'utilisateur B convient de saisir les informations de Monsieur Pierre LENOIR et se fait attribuer lui aussi une clef. Vous aurez deviné que A n'a pas encore terminé de saisir ses informations et que par conséquent l'utilisateur B se voit attribuer la même valeur de clef que l'utilisateur A, à savoir 53"

    Mais bon, tout est clair maintenant. Merci pour vos réponses!!!!

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par blapointe
    L'utilisateur A, procède à l'acquisition d'une clef en vue de saisir les données afférentes à Monsieur Gilles LEBLANC. Il lui est attribué la clef 53 puisque la dernière valeur de clef stockée dans la table MaTable est 52. Quelques instants plus tard, l'utilisateur B convient de saisir les informations de Monsieur Pierre LENOIR et se fait attribuer lui aussi une clef. Vous aurez deviné que A n'a pas encore terminé de saisir ses informations et que par conséquent l'utilisateur B se voit attribuer la même valeur de clef que l'utilisateur A, à savoir 53
    Oui, ça, c'est le paragraphe "3.1. Une fausse bonne idée", la solution qui consiste à essayer de gérer soi-même le prochain identifiant, en lisant les autres valeurs déjà insérées dans la base, rien à voir avec un champ de type auto-incrément ou une séquence

    Citation Envoyé par blapointe
    Mais bon, tout est clair maintenant. Merci pour vos réponses!!!!
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

Discussions similaires

  1. [MPD] Identifiant auto incrémenté
    Par MacFly58 dans le forum Schéma
    Réponses: 9
    Dernier message: 19/12/2012, 22h54
  2. Réponses: 6
    Dernier message: 25/04/2008, 10h29
  3. [MySQL] Identifiant Primaire qui s'auto incrémente
    Par The Molo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/04/2007, 13h58
  4. Réponses: 8
    Dernier message: 08/06/2006, 11h20
  5. Récuperer l'identifiant d'un auto-incrémente
    Par MANU_2 dans le forum Bases de données
    Réponses: 5
    Dernier message: 19/10/2005, 01h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo