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éveloppement SQL Server Discussion :

Clef primaire séquentielle ou tables de clefs?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 321
    Par défaut Clef primaire séquentielle ou tables de clefs?
    Salut à tous,

    Je reprends une partie de mon post précédent parce que la question que je voudrais poser ici s'est un peu perdue dans le sujet de l'autre.

    Je me demande ce est préférable de faire dans la conception d'une BDD : mettre des clefs primaires séquentielles dans les tables ou créer une table des clefs ?

    J'ai lu, relu, re-relu le super article de Frédéric Brouard sur les clefs auto incrémentées et je me pose plein de questions :

    1) Dans les SGBD d'aujourd'hui, l'auto-incrémentation de la clef primaire (dans le cas d'une clef séquentielle) se fait au moment de l'insert dans la base de donnée ou dès que l'utilisateur ouvre une nouvelle ligne ?

    2) Dans le cas ou la clef est créée au moment de l'insert cela veut dire que 'lintégrité de la base est sauvegardée puisque deux utilisateurs ne peuvent enregistrer exactement au même moment ?

    Par ailleurs, lors d'une suppression de ligne d'un enregistrement la clef est définitivement perdue donc il n'y a plus de risque en cas d'archivage et de restauration? non ?

    3) Dans le cas de la construction d'une table des clefs tel qu'expliqué dans l'article, je ne comprends pas complètement la construction de la procédure décrite par Sqlpro:
    Le nom des tables est récupéré dans INFORMATION_SCHEMA.TABLES stocké dans la variable @Nom_Table puis inséré dans la table LesClefs.

    A priori c'est le même principe pour la clef primaire et sa variable @Nom_Champ.

    je remets ici la partie du code :
    SET @OK = 0

    SELECT @OK = COUNT(*)
    FROM SYS_DB_MASTERKEY
    WHERE MSK_TABLE_NAME = @NOM_TABLE
    -- elle n'existe pas, on l'y insère
    IF @OK = 0
    BEGIN
    SET @STR_QRY = 'INSERT INTO SYS_DB_MASTERKEY ' + 'SELECT ''' + @NOM_TABLE + ''', MAX(' + @NOM_CHAMP +') ' + ' FROM ' + @NOM_TABLE
    EXEC(@STR_QRY)
    END
    Mais dans cette dernière partie de la procédure, comment détermine-t-on quel champ sera stocké dans la variable @Nom_Champ. Y a t-il un moyen grâce à INFORMATION.SCHEMA de déterminer quels champs a une clef primaire surtout dans le cas de Clef sur deux champ ?

    Je ne sais pas si mes questions sont intéressantes et surtout si elles ne sont pas complètement idiotes mais j'aimerais quand même savoir?

    Si par hasard vous pouviez éclairer ma lanterne...

    Merci à tous
    et surout toutes mes excuses si, du coup, mon post fait doublon avec le précédent.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par FadeToBlack Voir le message
    1) Dans les SGBD d'aujourd'hui, l'auto-incrémentation de la clef primaire (dans le cas d'une clef séquentielle) se fait au moment de l'insert dans la base de donnée ou dès que l'utilisateur ouvre une nouvelle ligne ?
    Ouvre ne veut rien dire. C'est fait dans un trigger interne de type BEFORE INSERT

    2) Dans le cas ou la clef est créée au moment de l'insert cela veut dire que 'lintégrité de la base est sauvegardée puisque deux utilisateurs ne peuvent enregistrer exactement au même moment ?
    Toujours.

    En sus, l'algorithme d'auto incrément supporte des opérations massivement parallèles que le code de mon article ne peut reproduire.

    Par ailleurs, lors d'une suppression de ligne d'un enregistrement la clef est définitivement perdue donc il n'y a plus de risque en cas d'archivage et de restauration? non ?
    Exact, mais même dans le code donné c'est le cas


    3) Dans le cas de la construction d'une table des clefs tel qu'expliqué dans l'article, je ne comprends pas complètement la construction de la procédure décrite par Sqlpro:
    Le nom des tables est récupéré dans INFORMATION_SCHEMA.TABLES stocké dans la variable @Nom_Table puis inséré dans la table LesClefs.

    A priori c'est le même principe pour la clef primaire et sa variable @Nom_Champ.

    je remets ici la partie du code :

    Mais dans cette dernière partie de la procédure, comment détermine-t-on quel champ sera stocké dans la variable @Nom_Champ. Y a t-il un moyen grâce à INFORMATION.SCHEMA de déterminer quels champs a une clef primaire surtout dans le cas de Clef sur deux champ ?
    Ne confondez pas auto incrément et clef primaire, même si la plupart du temps la colonne auto incrémentée est laussi la clef primaire, cela n'est nullement une obligation, pas plus que l'unicité...

    Je ne sais pas si mes questions sont intéressantes et surtout si elles ne sont pas complètement idiotes mais j'aimerais quand même savoir?

    Si par hasard vous pouviez éclairer ma lanterne...

    Merci à tous
    et surout toutes mes excuses si, du coup, mon post fait doublon avec le précédent.
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 321
    Par défaut
    Merci de cette réponse rapide.

    En premier lieu, je voudrais dire que mon post est en aucun cas une critique de votre article. Je ne vois pas comment je serais en mesure de le faire même si je le voulais. Mais j'essaie de comprendre.

    Donc ok pour le fait de distinguer Champ séquentielle et clef primaire.

    J'avoue que dans ma formation, on m'a plutôt conseillé de mettre une clef primaire séquentielle à chaque table (sauf pour des tables du genre sexe, etc.....).

    Pour ce qui est de la variable @Nom_Champ, comment votre script détermine le champ à prendre ? Dans le cas de

    Il faudrait que je lise une doc sur le fond de sql, j'entends par là SHEMA INFORMATION, systable etc....

    en tout cas merci de vos conseils
    a+

Discussions similaires

  1. Clef primaire sur une table qui n'en a pas d'après PhpMyAdmin
    Par bubulemaster dans le forum Requêtes
    Réponses: 5
    Dernier message: 11/04/2009, 18h44
  2. Réponses: 3
    Dernier message: 24/07/2007, 18h06
  3. Réponses: 1
    Dernier message: 20/06/2007, 13h36
  4. Comment comment définir une clef primaire dans une table??
    Par nek_kro_kvlt dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/02/2005, 21h06
  5. récupérer la clef primaire d'une table
    Par orionis69 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/02/2004, 13h00

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