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

Requêtes MySQL Discussion :

Clé primaire composée et index


Sujet :

Requêtes MySQL

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2009
    Messages : 98
    Points : 71
    Points
    71
    Par défaut Clé primaire composée et index
    Bonjour,

    Dans une table, est ce qu'il est utile de rajouter un index sur une clé étrangère qui est une partie de la clé primaire composée ?

    J'ai trois tables :
    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
    CREATE TABLE IF NOT EXISTS client (
      id_client INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
      nom VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      PRIMARY KEY (id_client)
    )
    ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
     
    CREATE TABLE IF NOT EXISTS voiture (
      id_voiture INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
      nom VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      PRIMARY KEY (id_voiture)
    )
    ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
     
    CREATE TABLE IF NOT EXISTS client_voiture (
      fk_client INTEGER UNSIGNED NOT NULL,
      fk_voiture INTEGER UNSIGNED NOT NULL,
      PRIMARY KEY (fk_client, fk_voiture),
      CONSTRAINT client_voiture_client FOREIGN KEY (fk_client) REFERENCES client (id_client) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT client_voiture_voiture FOREIGN KEY (fk_voiture) REFERENCES voiture (id_voiture) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Nous avons donc la table client_voiture qui fait le liant entre les tables client et voiture. J'ai ma clé composée (PRIMARY KEY (fk_client, fk_voiture)), j'ai bien mes contraintes pour les clés étrangères.

    J'aimerai savoir s'il est utile, ou quelle serait l'utilité de rajouter ces deux nouveaux index à la table client_voiture :
    INDEX fk_client (fk_client)
    INDEX fk_voiture (fk_voiture)

    Ce qui nous donnerait au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IF NOT EXISTS client_voiture (
      fk_client INTEGER UNSIGNED NOT NULL,
      fk_voiture INTEGER UNSIGNED NOT NULL,
      PRIMARY KEY (fk_client, fk_voiture),
      INDEX fk_client (fk_client),
      INDEX fk_voiture (fk_voiture),
      CONSTRAINT client_voiture_client FOREIGN KEY (fk_client) REFERENCES client (id_client) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT client_voiture_voiture FOREIGN KEY (fk_voiture) REFERENCES voiture (id_voiture) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Merci par avance pour vos lumières.

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    A priori, et dans ton contexte, ce n'est pas nécessaire.

    http://dev.mysql.com/doc/refman/5.0/...nstraints.html

  3. #3
    Membre régulier
    Profil pro
    aucun
    Inscrit en
    Octobre 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2009
    Messages : 98
    Points : 71
    Points
    71
    Par défaut
    Bonjour qi130,

    Merci pour ta réponse et pour le lien que j'avais déjà regardé (en version 5.1 ^_^).

    Cependant, sauf erreur de ma part, je n'ai pas trouvé la réponse à ces deux questions :
    - Pourquoi dans mon contexte il n'est pas utile de rajouter ces index ?
    - Dans quel contexte il serait utile de les rajouter ?

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Index sur plusieurs colonnes
    Alors l'index nom_index est un index de nom et de prenom. Cela sera utile pour les requêtes qui spécifient des valeurs dans une gamme donnée de nom, ou pour à la fois nom et prenom. Ainsi l'index nom_index sera utilisé pour les requêtes suivantes:
    Donc dans votre cas, l'index sur fk_client n'est pas nécessaire puisque le client est la 1ere colonne de votre clé primaire (qui généralement génère un index pour la validation de la contrainte)
    L'index sur fk_voiture est lui nécessaire pour accélérer la validation de la contrainte clé étrangère lors de modification sur la table voiture.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    L'index sur fk_voiture est lui nécessaire pour accélérer la validation de la contrainte clé étrangère lors de modification sur la table voiture.
    tout à fait et même plus : il sera utile dans les simples requêtes select du style :

    quel est le client qui à la voiture dont le nom est 'xxx'

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2009
    Messages : 98
    Points : 71
    Points
    71
    Par défaut
    Bonjour à vous deux,

    Merci pour ces précisions

    Je marque ce sujet comme résolu

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 10/05/2011, 16h12
  2. clé primaire composée et index
    Par ionesco dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/10/2009, 09h27
  3. Réponses: 2
    Dernier message: 26/10/2005, 19h57
  4. Foreign key sur clé primaire composée
    Par mona dans le forum Oracle
    Réponses: 6
    Dernier message: 13/10/2005, 22h36
  5. clé primaire composée de 2 clés étrangères
    Par Tigresse dans le forum Installation
    Réponses: 5
    Dernier message: 28/07/2003, 14h38

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