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

SQL Oracle Discussion :

création d une table contenant plusieurs primary key


Sujet :

SQL Oracle

  1. #1
    Débutant  
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 346
    Points : 86
    Points
    86
    Par défaut création d une table contenant plusieurs primary key
    Salut, tout le monde

    Je veux faire le script de création d'une table contenant 3 clés primaires et voici mon script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table tab1(
    id number(2) ,
    matricule number(5),
    nom char(6),
    prenom char (6)
    )
    est ce que c est mieux de définir mes primary key de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE UNIQUE INDEX tab1Primary ON tab1
    (id, matricule,nom)
    ou bien de cette façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE tab1 ADD (CONSTRAINT  tab1_PK  PRIMARY KEY                  
    (id,
    matricule,
    nom);
    c a d est ce que d ajouter les contraintes directement ou bien de dèfinir un unique index pour les clés?

    Merci d'avance

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Par définition du terme "primaire" une table ne contient qu'une seule clé primaire, pas trois...

    Si tu veux dire que la clé primaire de ta table porte sur 3 colonnes, alors la 2ième solution est la bonne.

    Meme si niveau physique c'est quasiment la même chose (puisque une clé primaire est forcément attachée à un index unique créé implicitement en même temps,) il faut tant qu'à faire déclarer ta contrainte en tant que telle, ça évitera bien des ennuis par la suite...

    Ceci dit, c'est assez Strange d'avoir une colonne appelée "ID" ne se suffisant pas à elle même pour être une clé primaire... un nom dans une clé, c'est un nid à emm...

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Points : 605
    Points
    605
    Par défaut
    Citation Envoyé par remi4444 Voir le message
    Meme si niveau physique c'est quasiment la même chose (puisque une clé primaire est forcément attachée à un index unique créé implicitement en même temps,)
    c'est faux !!! Oracle n'a pas besoin depuis la version 8 d'oracle (et l'apparition des "deferrable constraints", càd évaluées au moment du commit et pas du DML) d'un index unique pour satisfaire une contrainte de type PK.

    d'où, l'intérêt de créer une contrainte (objet "logique") et pas un index (objet physique) pour mettre en place l'intégrité des données . Oracle ré-utilisera un index non unique déjà créé pour valider une pk, plutôt que de créer un index supplémentaire (gain d'espace, et de performance pour les DML)

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Dans l'instruction donnée plus haut, il ne crée pas un index unique sur les 3 colonnes !?

    EDIT: ok, j'ai été un peu vite, j'aurait du dire dans ce cas précis et pas "forcément", au temps pour moi

  5. #5
    Débutant  
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 346
    Points : 86
    Points
    86
    Par défaut
    Merci pour vos réponses,

    Je travaille par Oracle 10g , alors pour définir ma clé primaire j'ai besoin seulement de ce code
    CREATE UNIQUE INDEX tab1Primary ON tab1
    (id, matricule,nom)
    Alors ce n'est pas la peine de définir mon constraint

    Merci d'avance

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Du coup, tu n'auras pas de clé primaire à proprement parler... moi je trouve que c'est dommage.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par sonia5 Voir le message
    Alors ce n'est pas la peine de définir mon constraint
    Non c'est l'inverse. Vous devez définir la contrainte, pas l'index.

    En reprenant votre exemple :
    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
    18
    19
    20
    21
    22
    23
    24
    CREATE TABLE tab1
    (
        id        number(2) ,
        matricule number(5),
        nom       char(6),
        prenom    char(6)
    );
    -- Table created.
     
    CREATE UNIQUE INDEX tab1Primary
    ON tab1 (id, matricule,nom);
    -- Index created.
     
    INSERT INTO tab1 (prenom) values ('a');
    -- 1 row created.
     
    commit;
    -- Commit complete.
     
    select * from tab1;
     
            ID  MATRICULE NOM    PRENOM
    ---------- ---------- ------ ------
                                 a
    Une belle clef primaire nulle !

    Quand vous voulez forcer la contrainte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE tab1
    ADD CONSTRAINT tab1_PK
          PRIMARY KEY (id, matricule, nom);
    -- ORA-01449: colonne contenant des valeurs non renseignées (NULL) ; spécification NOT NULL impossible
    Si vous commencez par la contrainte :
    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
    CREATE TABLE tab2
    (
        id        number(2) ,
        matricule number(5),
        nom       char(6),
        prenom    char(6)
    );
    -- Table created.
     
    ALTER TABLE tab2
    ADD CONSTRAINT tab2_PK
          PRIMARY KEY (id, matricule, nom);
    -- Table altered.
     
    INSERT INTO tab2 (prenom) values ('a');
    -- ORA-01400: impossible d'insérer NULL dans ("TAB2"."ID")
    Ici votre intégrité est garantie, pas dans le premier cas.

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Tout à fait Waldar, j'avais zappé le coté "not null" de la clé primaire, effectivement c'est primordial...

  9. #9
    Débutant  
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 346
    Points : 86
    Points
    86
    Par défaut
    d'accord merci pour vos rèponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de création d'une table avec le nom KEY
    Par uaibys dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 22/09/2013, 18h04
  2. delete dans une table contenant des primary key
    Par bracket dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/11/2008, 17h41
  3. Creation de tables avec plusieurs primary key
    Par The eye dans le forum Oracle
    Réponses: 5
    Dernier message: 28/12/2007, 10h05
  4. Création d'une table avec foreign key.
    Par Paulinho dans le forum Débuter
    Réponses: 6
    Dernier message: 01/12/2005, 18h47
  5. Création d'une table avec foreign key
    Par lepierre dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/09/2004, 14h20

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