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 composée


Sujet :

Langage SQL

  1. #1
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 593
    Points : 353
    Points
    353
    Par défaut Clé primaire composée
    Bonjour,

    Ma question est peut-être tordue, mais je voulais savoir, est-il possible de créer une table avec une clé primaire composée d'un champ à n caractères, plus le premier caractère de ce champ, sans qu'il existe une colonne pour contenir ce premier caractère?
    Exemple: table[code, libellé] contient la données ['C123', 'Eagle one'].
    Je veux que ma clé primaire soit ['C123', 'C'].
    Suis-je obligée de rajouter une colonne pour qu'elle contienne 'C'?

    Merci!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Quel est l'intérêt fonctionnel ? Cela ne change en rien l'unicité de la clé primaire
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 593
    Points : 353
    Points
    353
    Par défaut
    C'est juste pour ne pas dupliquer l'information, qui est déjà contenue dans le code...

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Quel est l'intérêt fonctionnel puisque vous avez déjà l'information 'C' sur le premier caractère ?

    D'où, une fois de plus, le mauvais choix d'un code signifiant en tant que clé primaire d'une table !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  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 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Fonctionnellement cela à un intérêt énorme !

    Faisons une petite analogie...

    Imaginons que nous rentrons chez nous. Le quidam ordinaire qui n'a qu'une serrure à sa porte donne un tour de clef et l'ouvre. Notre pékin du jour, un peu rêveur sur les bords (daydream123) à décidé de donner un tour de clef pour ouvrir, puis refermer et rouvrir sa serrure !
    Fonctionnellement, le gagnant de cette stratégie c'est le serrurier... Sachant qu'une serrure est garantie avec 100 000 ouvertures, la serrure va tomber en panne deux fois plus vite !

    Moralité : Quand ou joue aux cons, y'a toujours un gagnant !

    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
    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
    J'avoue que j'ai pas compris (humour ?) le message de SQLpro

    J'imagine que l'analogie porte sur "plus le code est crade, et plus les devs ont de boulot, et plus les experts (comme SQLpro) ont d'avenir devant eux", mais j'ai peut-être raté une subtilité

    Sinon, pour en revenir, autant une clé composée, oui, c'est possible.
    Autant une clé portant sur une colonne calculée, c'est juste pas possible.
    Et autant pour une clé telle que décrite, la question ne se pose pas : vomir ou changer de métier, telle est la réaction que vous devriez avoir suite à une idée pareille.
    On ne jouit bien que de ce qu’on partage.

  7. #7
    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
    Je pense que daydream123 aura compris que c'est une mauvaise idée.

    Qu'essayez-vous au final de valider avec cette contrainte ?

  8. #8
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 593
    Points : 353
    Points
    353
    Par défaut
    Autant une clé portant sur une colonne calculée, c'est juste pas possible.
    C'est tout ce que je voulais savoir...
    Merci pour les réponses!

  9. #9
    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 daydream123 Voir le message
    C'est tout ce que je voulais savoir...
    Alors autant bien vous renseigner, car contrairement à ce qu'a indiqué StringBuilder, il est techniquement possible de définir une clef sur une colonne calculée.

    Mais je me pose la même question que al1_24, CinePhil et Waldar : quel est l’intérêt de ce que vous cherchez à faire ?

  10. #10
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 593
    Points : 353
    Points
    353
    Par défaut
    Comme j'avais répondu plus haut, c'est pour éviter une duplication des données, car l'information est contenue dans le code.
    En fait, on avait une table à 2 colonnes: code_a, code_b, avec code_a comme clé primaire.
    On a reçu un flux de données qui nous oblige à changer la clé primaire en (code_a, première lettre de code_b).
    Et je me demandais si j'étais obligée de créer une troisième colonne pour ne contenir que la prière lettre de code_b, alors qu'il existe déjà une colonne pour code_b (c'est ce que j'ai fini par faire).

  11. #11
    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
    Votre description et vos exemples jusqu’à présent laissaient penser qu'il s’agissait de prendre la première lettre de la même colonne :
    colonne_A + [première lettre de colonne_A], ce qui n'avait aucun sens...

  12. #12
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 593
    Points : 353
    Points
    353
    Par défaut
    Je me suis effectivement trompée

  13. #13
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    En résumé, vous découvrez pourquoi il ne faut pas prendre un code signifiant, susceptible d'être modifié, comme clé primaire. Rien ne vaut, pour les tables issues des entités types fortes du modèle conceptuel de données, une clé primaire de type entier auto-incrémenté.

    En fait, on avait une table à 2 colonnes: code_a, code_b, avec code_a comme clé primaire.
    On a reçu un flux de données qui nous oblige à changer la clé primaire en (code_a, première lettre de code_b).
    Vous créez une colonne 'nouveau-code' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE la_table
    ADD COLUMN nouveau_code VARCHAR([la taille nécessaire]) DEFAULT NULL
    Ensuite vous remplissez cette colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE la_table
    SET nouveau_code = code_A || code_B
    Si vous travaillez avec MySQL, il faudra utiliser SET nouveau_code = CONCAT(code_A, code_B)Vous vous assurez qu'il n'y a pas de doublons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nouveau_code, COUNT(*) AS nb_lignes
    FROM la_table
    GROUP BY nouveau_code
    HAVING COUNT(*) > 1
    Si la requête retourne des lignes c'est que vous avez plusieurs fois le même code et que votre astuce de concaténation de code ne peut pas fonctionner et donc encore moins être utilisée en clé primaire (une preuve de plus !).

    Si vous n'avez pas de doublon, vous pouvez indexer la colonne et lui poser une contrainte d'unicité. Lire aussi les tutoriels et cours de formation pour apprendre SQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  14. #14
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 593
    Points : 353
    Points
    353
    Par défaut
    Merci pour les précisions CinePhil

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

Discussions similaires

  1. [Oracle] modification d'une clé primaire composée
    Par petburn dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2006, 15h58
  2. [clé primaire composée] Champ NULL
    Par hair_peace dans le forum Oracle
    Réponses: 11
    Dernier message: 13/12/2005, 16h09
  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