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

Langage SQL Discussion :

Clé primaire plus clé unique : quelle utilité ?


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Points : 86
    Points
    86
    Par défaut Clé primaire plus clé unique : quelle utilité ?
    Bonjour sur le forum developpez !
    En parcourant un tutoriel officiel de java, je suis tombé sur un exemple de script de base de données (oracle) spécifiant la clé primaire ID et une clé unique également.
    Ma question est donc simple : quelle utilité d'avoir un champ clé primaire et une clé unique dans une table ?
    Merci d'avance...

    L'exemple donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE TABLE "FOREST"."PERSON"
    (
      ID int NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY 
          (START WITH 1, INCREMENT BY 1),
      FIRSTNAME varchar(50) NOT NULL,
      LASTNAME varchar(100) NOT NULL,
      EMAIL varchar(45) NOT NULL UNIQUE,
      ADDRESS varchar(45) NOT NULL,
      CITY varchar(45) NOT NULL,
      PASSWORD varchar(100),
      DTYPE varchar(31)
    )
    ;
    CREATE UNIQUE INDEX SQL_PERSON_EMAIL_INDEX ON "FOREST"."PERSON"(EMAIL)
    ;
    CREATE UNIQUE INDEX SQL_PERSON_ID_INDEX ON "FOREST"."PERSON"(ID)
    ;

  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 770
    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 770
    Points : 52 723
    Points
    52 723
    Billets dans le blog
    5
    Par défaut
    Cela fait partie des choses intelligente de l'art de la modélisation.

    La clef primaire sert essentiellement à faire des jointures. Pour qu'elle soit efficace et performante mieux vaut qu'elle soit :
    • concise (quelques octets et dans tous les cas moins d'octets que la longueur du mot du processeur - 32 ou 64 bits) afin d'être processée en une seule passe...)
    • asémantique (c'est à dire n'avoir aucune signification dans le système d'information)
    • stable (invariante pour sa valeur dans le temps)
    • monotone (aller en croissance ou décroissance à chaque nouvelle information à insérer)


    C'est bien ce que fait un auto incrément....

    Pour autant l'information sémantique a besoin de clef pour éviter des doublons. Ainsi le mail sert souvent d'identifiant pour les clients d'un site web. Bien entendu pas question que deux clients distincts aient le même mail. C'est une clef dite subrogée !

    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
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Je pense que sa question concerne surtout le second index unique, qui porte... sur la clé primaire !

    Une clé unique (unique index) interdit les doublons, sauf les valeurs nulles.
    Une clé primaire interdit les doublons et ne peut pas être nulle.

    Par conséquent, une clé unique sur une clé primaire est parfaitement redondante, puisqu'elle porte sur une colonne non nulle.

    Pour moi, elle n'a aucune utilité, et j'ose même espérer que le SGBD ne va pas la créer (tout au plus, créer un alias qui porte sur la clé primaire).

    En revanche, celui sur le nom, ou plus souvent, comme le dit SQLPro, sur l'adresse mail, est une bonne pratique, qui permet d'éviter les erreurs de saisie (doublons) et accélérer les recherches (on cherche généralement une personne par sont identifiant "logique" (nom, login, email, etc.) et non par son identifiant technique (clé primaire auto-incrément).

    -- Edit : je viens de relire, et de me rendre compte qu'on parle d'Oracle. Dans les anciennes versions (il me semblait que depuis, c'était "corrigé") une contrainte unique et une clé primaire ne donnaient pas systématiquement lieu à la création d'un index unique, qu'il fallait créer manuellement. D'où les deux index en fin de script. A mon avis, ils sont aujourd'hui complètement inutiles (sauf peut être pour la contrainte unique).
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Une clé unique (unique index) interdit les doublons, sauf les valeurs nulles.
    Ça dépend des SGBD, sur SQL-Server il ne peut y avoir qu'une valeur nulle dans une colonne unique.

    Citation Envoyé par StringBuilder Voir le message
    D'où les deux index en fin de script.
    Ça vient très certainement de l'outil qui a généré le script DDL depuis la table : il génère le script de la table avec la contrainte, puis il génère le script des index et affiche le tout.

    Citation Envoyé par StringBuilder Voir le message
    Dans les anciennes versions une contrainte unique et une clé primaire ne donnaient pas systématiquement lieu à la création d'un index unique
    Une clef primaire est toujours adossée à un index, mais pas forcément unique.
    Il me vient ces deux cas à l'esprit :
    1. si l'index existe avant la création de la contrainte
    2. si la contrainte est "deferrable"

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 723
    Points
    52 723
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Il me vient ces deux cas à l'esprit :
    1. si l'index existe avant la création de la contrainte
    2. si la contrainte est "deferrable"
    1) il est ignoré, un nouvel index est créé. Les deux index peuvent cohabiter. Seul Oracle pose problème car il interdit la pose d'un index IDENTIQUE
    2) aucune importance

    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/ * * * * *

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Points : 86
    Points
    86
    Par défaut
    Sur PostgreSQL on peut définir une clé primaire comme étant not null et unique. Si on ne met que primary key, la clé remplie toutes les conditions. Sachant ça, il est étonnant de voir des clé primaire déclarées avec ces deux contraintes en plus. Aussi il faut savoir que sur PostgreSQL une clé primaire ne peut pas être nulle.

    En tout cas merci pour vos explications !

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Une clé primaire, par définition, ne peut ni être null ni doublonnée.

    C'est son association avec un index unique qui n'est pas forcément systématique.
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. les interfaces; quelle utilité?
    Par noubigh dans le forum C#
    Réponses: 9
    Dernier message: 30/07/2008, 09h18
  2. Différence entre clé candidate, clé primaire et clé unique.
    Par West01 dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 08/11/2006, 16h15
  3. Réponses: 8
    Dernier message: 04/08/2006, 01h31
  4. [DataWareHouse] Quelle utilité des clés de substitution ?
    Par alpachico dans le forum Alimentation
    Réponses: 3
    Dernier message: 23/03/2006, 13h41
  5. la clé primaire elle est unique?
    Par ghita269 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 28/12/2005, 16h20

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