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

MS SQL Server Discussion :

Contrainte sur la valeur d'un champ devant exister dans une autre table


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 23
    Points
    23
    Par défaut Contrainte sur la valeur d'un champ devant exister dans une autre table
    Bonjour,

    J'ai une table COUNTRY qui contient une clé primaire 'Id' [int] un champ 'TranslationdId' [int].
    J'ai une deuxième table TRANSLATION dont la clé primaire est composé de 2 champs : 'Id' [int] et 'Lang' [char(5)].
    Je voudrait qu'il ne soit pas possible d'insérer un enregistrement dans COUNTRY si la valeur du champ 'TranslationId' n'existe pas dans au moins un champ 'Id' de la table TRANSLATION.

    Il ne s'agit donc pas d'un clé étrangère car le champ 'Id' de la table TRANSLATION n'est pas unique (c'est le couple 'Id'/'Lang' qui est unique). J'ai donc essayé avec un contrainte CHECK mais ça ne fonctionne pas :
    ...
    [TranslationId] [int] NOT NULL CHECK (TranslationId IN(SELECT DISTINCT [Id] FROM [Translation])),
    ...

    Savez-vous comment je peux gérer ce soucis? Et si c'est possible, avez-vous des idées sur les impacts en performance?

    Merci d'avance

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous devez pour cela ajouter également la colonne 'Lang' à la table COUNTRY pour pouvoir créer une clé étrangère.

    Cela dit il vaudrait mieux créer une clé subrogée, c'est à dire une clé purement technique comme clé primare, et ajouter une contrainte d'unicité sur la table TRANSLATION sur les colonne 'Id'et 'Lang'.

    La nouvelle clé primaire (subrogée) est alors référencée par la table COUNTRY.
    Les jointures sur des colonnes de type CHAR, c'est moche et par performant ...

    @++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    OK, merci pour la réponse rapide. En fait j'ai une relation n-n entre ma table COUNTRY et ma table TRANSLATION, un même pays a plusieurs traduction (en fait un seul id de traduction mais plusieurs langue) et une traduction peut correspondre à plusieurs pays.

    Donc d'un point de vue relationnel, je devrait avoir une table de liaison du type COUNTRY-TRANSLATION, ce qui résoudrait mon soucis proprement.

    Cependant, j'ai une quinzaines d'autres table similaires à la table COUNTRY et, via ce tour de passe passe, je voulais m'éviter de devoir gérer autant de tables de liaisons... A priori ce n'est pas possible, ou alors de façon applicative (sans contrainte dans le SGBD) et là, impossible d'assurer une cohérence des données...

  4. #4
    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 guste Voir le message
    je voulais m'éviter de devoir gérer autant de tables de liaisons...
    Attention, en voulant faire l’économie de la création de quelque tables, vous risquez d'engendrer un surcout (pour la création des requêtes qui seront plus complexes, sans parler de leur temps d’exécution) que vous ne constaterez que... trop tard

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Donc d'un point de vue relationnel, je devrait avoir une table de liaison du type COUNTRY-TRANSLATION, ce qui résoudrait mon soucis proprement.
    ça c'est clair.

    Cependant, j'ai une quinzaines d'autres table similaires à la table COUNTRY et, via ce tour de passe passe, je voulais m'éviter de devoir gérer autant de tables de liaisons
    Non, il n'a effectivement pas de magie : un modèle est bon ou il ne l'est pas.

    A priori ce n'est pas possible, ou alors de façon applicative (sans contrainte dans le SGBD) et là, impossible d'assurer une cohérence des données...
    C'est tout à fait exact mais ce n'est pas la seule raison.

    Bonne lecture et @++

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/08/2013, 20h37
  2. Impossible d'afficher une valeur existe dans une autre table
    Par mcharmat dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 06/02/2013, 06h38
  3. Réponses: 2
    Dernier message: 28/10/2012, 10h50
  4. [AC-2003] Valeur d'un champ en fonction d'une autre table ou formulaire
    Par rorobase dans le forum Access
    Réponses: 1
    Dernier message: 28/07/2010, 10h45
  5. Réponses: 1
    Dernier message: 20/07/2010, 12h28

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