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 :

Les index pour FOREIGN KEY ?


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut Les index pour FOREIGN KEY ?
    Bonjour,

    Je souhaite mettre une clé étrangère pour faire un "ON DELETE CASCADE" mais il faut mettre un index apparemment - > voir la syntaxe

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ALTER TABLE matable2 
       ADD CONSTRAINT login_fk 
          FOREIGN KEY [id] login
             REFERENCES matable(login)
    En fait je n'arrive pas à comprendre à quoi sert l'index? faut-il le mettre au hasard? ( je ne pense pas ^^ ) !
    Il permet d'optimiser et de faire en sorte que lors d'une recherche l'index permet de séparer ( en quelque sorte ) la colonne de la table.

    Voilà ce que j'ai compris, c'est très très flou. Pouvez-vous m'éclairer et me conseiller sur l'index à choisir SVP.

    Merci

  2. #2
    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 394
    Points
    18 394
    Par défaut
    Il faut mettre l'index sur la colonne qui porte la clef étrangère.
    En effet, lors d'un DELETE dans la table de référence, un DELETE sera également effectué sur la table utilisant cette référence.

    Sans index, ce DELETE fera un full table scan, alors qu'avec un index il pourrait l'utiliser.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    Pour les DELETE ça marche dans les deux sens? si je supprime de la table 1 ou de la table 2?

    Euh comment connaître l'index de ma référence? c'est la Cardinalité?

    Merci de l'aide

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Réfléchissez un peu!!!

    TABLE maitre : clef 1, 2, 3, 4, 5
    TABLE fille : clef étrangère 1, 1, 1, 2, 2, 5

    Si vous supprimez de la table fille une ligne, par exemple la première, s'il supprimait la clef 1 dans la table maître alors il devrait aussi supprimer toutes les valeurs de clef étrangère 1 dans la table fille. Ce qui reviendrait à dire :
    en supprimant une ligne de facture, je veut que tu me supprime la facture et toutes les lignes de la facture !!! Absurde non ?

    L'index se pose sur les colonnes de la clef étrangère (donc dans la table fille).

    Entre nous le mode CASCADE est à éviter. Préférez le mode SET NULL ou SET DEFAULT et nettoyez vos tables avec des batch aux heures creuses.


    Lisez ce que j'ai écrit sur la gestion de l'IR :
    http://sqlpro.developpez.com/cours/s...partie2#L7.3.2
    http://sqlpro.developpez.com/contrai...aintes_SQL.pdf
    paragraphe 5
    http://blog.developpez.com/sqlpro/p8...plexes-dans-l/


    A +

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    J'ai crée mon index dans ma table fille mais je ne sais toujours pas quoi mettre dans [id] de ma requête :s

    Pour le mode CASCADE je vais suivre ton conseil.

  6. #6
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par vocal94130 Voir le message
    J'ai crée mon index dans ma table fille mais je ne sais toujours pas quoi mettre dans [id] de ma requête :s
    C'est un paramètre facultatif qui ne semble pas servir à grand chose.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    D'accord bon, je pensais que l'erreur venait de là mais en fait c'est la syntaxe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ALTER TABLE matable2 
       ADD CONSTRAINT login_fk 
          FOREIGN KEY (login)
             REFERENCES matable(login)
    Merci de votre aide

  8. #8
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    A noter que 'login' n'est pas une bonne clé pour une table !

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    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 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Moi j'ai deux choses à dire :

    1/ Si je ne m'abuse, un index est automatiquement créé lors de la création d'une clé étrangère, au même titre qu'un index est automatiquement créé lors de la création d'une clé primaire.

    2/ Je ne peux que m'insurger contre le "DELETE CASCADE", qui est excessivement dangereux, et source de tout un tas de bugs :
    - En cas de fausse manipulation, on peut arriver à vider une base entière avec un simple DELETE dans une table.
    - Dans bien des cas, pour des raisons de références circulaires, on ne peut pas mettre en pratique ce genre de choses (clés étrangères sur un champ de la même table, par exemple).
    - Y'a rien de mieux pour mettre à genoux un serveur, ou même péter un rollback segment et carrément tout planter.
    - Dans la pratique, on n'en a que très rarement besoin, et la plupart du temps, il vaut mieux au contraire interdire la suppression dans la table de référence si des filles existent (c'est une philosophie de base, il est préférable de résoudre du bas vers le haut, plutôt que de s'éparpiller au risque de ne plus maîtriser ce qu'on fait : une fois devant son écran, l'utilisateur aura bien du mal à mesurer l'impact d'un bouton "supprimer" qui va effacer la moitié de son fichier client parce qu'il a la mauvaise idée de vouloir supprimer le sexe "Féminin" car il trouvait que "Femme" était plus joli)

  10. #10
    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 394
    Points
    18 394
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Si je ne m'abuse, un index est automatiquement créé lors de la création d'une clé étrangère, au même titre qu'un index est automatiquement créé lors de la création d'une clé primaire.
    Vous vous abusez

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Comme je l'ai expliquer mainte fois, aucun index n'est créé sous une clef étrangères. Cela pour les raisons évidentes que j'ai exposées ici : http://sqlpro.developpez.com/cours/quoi-indexer/#LVI-A

    A +

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    Ok, merci !

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

Discussions similaires

  1. Organiser les index pour quelle soit 1, 2, 3..
    Par CLion dans le forum SQLite
    Réponses: 8
    Dernier message: 02/03/2015, 17h58
  2. comment faire les clés étrangères "foreign key"
    Par geeksDeve dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/06/2011, 10h32
  3. Est ce que les Foreign keys sont indexées
    Par olibara dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/08/2009, 12h29
  4. pbm avec les foreigns keys.....
    Par j_bonc dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 11/06/2004, 11h23
  5. Foreign-key et indices/index
    Par mesquest dans le forum Outils
    Réponses: 3
    Dernier message: 21/05/2004, 15h22

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