none
Créer une clée primaire composée de deux champs RRS feed

  • Question

  •  

    Bonjour,

    J'aimerais créer une clé primaire composée de 2 champs, mais pour moi c'est encore très flou.

    En effet, je prend l'exemple de deux tables (Pays et Banque)

    • Banque

               -  BanqueNom

               -  BanqueAdresse

               -  PaysNom (à sélectionner à travers un ComboBox lié à la Table Pays)

               -  BanqueMail

    • Pays

               -  PaysNom (Clé)

               -  PaysVille

    Mon soucis est le suivant:

    1. Dans la table Banque , j'aimerais que le champ BanqueNom soit associé au champ Pays (qui importe ses valeurs de la table pays) pour créer une clé primaire.
    En fait je travaille avec vb studio 2008 et je crée ma base de données par la méthode -->explorateur -->Créer une BD ... (bref pas par les codes qui ne me font plus trop peur )Merci
    Petit à petit l'oiseau construit son nid
    vendredi 16 avril 2010 11:09

Réponses

  • Bonjour,

    vous pouvez effectuer cette manipulation sous visual studio.

    - Ouvrez la table désirée depuis l'explorateur

    - Dans le menu Table Designer vous choisissez Index et Clé ( il y a aussi des icones disponible dans la barre d'outil )

    - Vous définissez le nom de l'index

    - Dans la zone colonne : vous choisissez vos deux colonnes

    - IsUnique doit être passé à vrai

     

    Sinon vous pouvez directement effectuez une requête :

    - placer vous sur votre base

    - click droit > new query

    - quand la pop up arrive vous la fermer et désactivez les panels diagram et critère ( barre de menu )

    - vous pouvez alors saisir l'instruction de votre choix et l'exécuter

     

    Sinon installer SqlServer Management Studio, via une version SQLExpress par exemple.

     

    Cordialement

     

    • Marqué comme réponse Alex Petrescu mercredi 21 avril 2010 09:43
    lundi 19 avril 2010 12:32
  • Bon alors ça change les choses :)

    De ce que je comprends :

    - La banque peut être présente dans plusieurs pays

    - Un pays peut avoir plusieurs banques

    - Une banque possède un pays d'origine ( mais peut exister dans plusieurs pays )

    Dans ce cas il te faudrait une table d'association entre banque et pays : par exemple une table contenant uniquement des clés étrangères IdBanque et IdPays.

    Je ne te conseille pas d'avoir des clés primaire dont le nom soit signifiant : par exemple si le nom du pays était dans la clé de la table banque, si jamais tu dois changer le pays d'origine tu devrais changer la clé primaire .... et donc ce n'est plus une clé :)

     

    Cordialement

     

     

    • Marqué comme réponse Alex Petrescu mercredi 21 avril 2010 09:43
    vendredi 16 avril 2010 12:32
  • C'est bien ça et pour éviter ces doublons vous pouvez déclarer un index ou une contrainte sur la table d'association. Par exemple un index :

    CREATE UNIQUE INDEX Index_tbl_Asso ON tbl_Asso (IdBanque,IdPays)

    voir msdn pour syntaxe détaillée : CREATE INDEX (Transact-SQL)

    Cordialement

     

    • Marqué comme réponse Alex Petrescu mercredi 21 avril 2010 09:43
    vendredi 16 avril 2010 14:29

Toutes les réponses

  • Bonjour,

    si j'ai bien compris il semble que la table User ne devrait pas contenir l'information Pays. En effet dans la table Banque tu as déjà un lien avec la table pays : tu connais donc le pays dans lequel se trouve la banque. Si tu places simplement une clé étrangère dans la table user avec par exemple BanqueId ( un identifiant unique que tu devrais ajouter à la table Banque ) tu sauras à quelle banque appartient le user ( et donc à quelle pays puisque la banque est associé à un pays ).

    Si tu ajoutais l'information Banque dans la table user, tu risquerais d'avoir des incohérences car les informations banque seraient à deux endroits : dans la table banque et dans la table user.

    Cordialement

    vendredi 16 avril 2010 11:42
  • Aïe, aïe, aïe

     

    j'ai glissé quelques erreurs au niveau de ma préoccupation (je viens de corriger).

    En fait il s'agit juste de deux table (banque et pays).

    Il s'agit d'une base où j'enregistrerais des banques et leurs localisations.

    Ainsi la table pays aura pour index PaysNom , et puisqu'une banque pourra être présente dans plusieurs pays différents (et constituer des enregistrements différents), j'aimerais donc que la clé primaire de la table Banque soit liée à son pays d'implantation ( par la combinaison des champsBanqueNom etPaysNom ).

     

    Cordialement

    vendredi 16 avril 2010 12:08
  • Bon alors ça change les choses :)

    De ce que je comprends :

    - La banque peut être présente dans plusieurs pays

    - Un pays peut avoir plusieurs banques

    - Une banque possède un pays d'origine ( mais peut exister dans plusieurs pays )

    Dans ce cas il te faudrait une table d'association entre banque et pays : par exemple une table contenant uniquement des clés étrangères IdBanque et IdPays.

    Je ne te conseille pas d'avoir des clés primaire dont le nom soit signifiant : par exemple si le nom du pays était dans la clé de la table banque, si jamais tu dois changer le pays d'origine tu devrais changer la clé primaire .... et donc ce n'est plus une clé :)

     

    Cordialement

     

     

    • Marqué comme réponse Alex Petrescu mercredi 21 avril 2010 09:43
    vendredi 16 avril 2010 12:32
  • YESSSS!

     

    Si je t'ai bien compris, il suffit de:

    1. créer mes deux tables avec de nouveau Index ( du style IdBanque et IdPays)
    2. Créer une tables d'association qui ne contiendra que mes index et à travers laquelle je pourrais effectuer mes liens.

    Si c'est le cas, ma difficulté est liée à la possibilité de doublons des enrégistrements dans les tables individuelles car, on pourra dans les différentes tables faire un même enrégistrement plusieurs fois (sans que cella ne mentionne une erreur)

               Ex1: dans la table pays on pourra enregistrer lenom d'un pays plusieurs fois car le champ NomPays n'est pas un index (à moins qu'il n'existe un moyen de rendre les enregistrements d'un champs uniques)

    Donc en quelques sorte, j'utilisais des noms significatifs comme index pour éviter les doublons lors des enregistrements.

     

    Pourriez vous s'il vous plait m'indiquer comment contourner ces doublons en utilisant des index tels IdBanque et IdPays??

     

    Cordialement


    Petit à petit l'oiseau construit son nid
    vendredi 16 avril 2010 13:49
  • C'est bien ça et pour éviter ces doublons vous pouvez déclarer un index ou une contrainte sur la table d'association. Par exemple un index :

    CREATE UNIQUE INDEX Index_tbl_Asso ON tbl_Asso (IdBanque,IdPays)

    voir msdn pour syntaxe détaillée : CREATE INDEX (Transact-SQL)

    Cordialement

     

    • Marqué comme réponse Alex Petrescu mercredi 21 avril 2010 09:43
    vendredi 16 avril 2010 14:29
  • Merci NIKHO,

     

    Je vais travailler avec cette nouvelle méthode ce week-end et j'espère revenir avec un bon résultat en debut de semaine.

     

    Bon Week-end


    Petit à petit l'oiseau construit son nid
    vendredi 16 avril 2010 15:00
  • Bonjour,

    J'ai l'habitude de créer mes petites bases de données (sous visual studio 2008) par la méthode classique (Explorateur de serveur --> connexion à une source de données --> ajouter une connexion ....), mais j'ai l'impression que celle-ci ne me permet pas de mieux gérer mes clés composites telles que décrites dans l'article plus haut ''CREATE INDEX (Transact-SQL)''.

    J'aimerais savoir la procédure (démarche, interface et / logiciels à utiliser) pour créer une base de données par les codes, car nombreux sont les tutos qui traitent du sujet, mais je n'ai pas encore trouver un qui présente la démarche (ex: Fichier --> Nouveau --> Base de données...)

    Cordialement


    Petit à petit l'oiseau construit son nid
    lundi 19 avril 2010 09:04
  • Bonjour,

    vous pouvez effectuer cette manipulation sous visual studio.

    - Ouvrez la table désirée depuis l'explorateur

    - Dans le menu Table Designer vous choisissez Index et Clé ( il y a aussi des icones disponible dans la barre d'outil )

    - Vous définissez le nom de l'index

    - Dans la zone colonne : vous choisissez vos deux colonnes

    - IsUnique doit être passé à vrai

     

    Sinon vous pouvez directement effectuez une requête :

    - placer vous sur votre base

    - click droit > new query

    - quand la pop up arrive vous la fermer et désactivez les panels diagram et critère ( barre de menu )

    - vous pouvez alors saisir l'instruction de votre choix et l'exécuter

     

    Sinon installer SqlServer Management Studio, via une version SQLExpress par exemple.

     

    Cordialement

     

    • Marqué comme réponse Alex Petrescu mercredi 21 avril 2010 09:43
    lundi 19 avril 2010 12:32