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 :

Foreign Key sur une partie de Primary Key


Sujet :

Langage SQL

  1. #1
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut Foreign Key sur une partie de Primary Key
    Bonjour,
    J'aurais besoin de référencer un attribut vers un attribut quelconque d'une autre table (qui est en fait une sous-clef). Seulement le référencement par Foreign Key ne me permet que de référencer la clef entière de cette autre table. Et là je bloque...

    Les tables sont déclarées comme suit :
    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 Table1 (
    	id INTEGER,
    	ligne VARCHAR2(50),
    	CONSTRAINT pk_Table1 PRIMARY KEY(id)
    );
     
    CREATE TABLE Table2 (
    	id_1 INTEGER,
    	id_2 INTEGER,
    	ligne INTEGER,
    	CONSTRAINT pk_Table2 PRIMARY KEY(id_1, id_2)
    );
     
    CREATE TABLE Correspondance (
    	id_a INTEGER,
    	id_b INTEGER,
    	CONSTRAINT pk_Correspondance PRIMARY KEY(id_a, id_b),
    	CONSTRAINT fk_Correspondance_Table1 FOREIGN KEY(id_a) REFERENCES Table1(id),
    	CONSTRAINT fk_Correspondance_Table2 FOREIGN KEY(id_b) REFERENCES Table1(id_1)
    );
    Seulement, forcément, ça ne fonctionne pas...

    J'ai bien essayé avec un "CHECK" mais il ne semble pas en apprécier la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE Correspondance (
    	id_a INTEGER,
    	id_b INTEGER,
    	CONSTRAINT pk_Correspondance PRIMARY KEY(id_a, id_b),
    	CONSTRAINT fk_Correspondance_Table1 FOREIGN KEY(id_a) REFERENCES Table1(id),
    	CONSTRAINT ck_Correspondance_Table2 CHECK(id_b in Table2(id_1))
    );
    Si vous savez comment faire, ça m'intéresse beaucoup !

    Merci d'avance,
    Loceka.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 63
    Points : 39
    Points
    39
    Par défaut bonjour
    ca te met quoi com erreur?

  3. #3
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Citation Envoyé par l'erreur de Foreign Key
    no matching unique or primary key for this column-list
    Mais je sais d'où viens cette erreur. Ce que je ne sais pas c'est comment la "contourner"... Comment faire en sorte de référencer un attribut qui n'est pas une clef primaire.

    Edit :
    Citation Envoyé par l'erreur de CHECK
    "ID_1": invalid identifier

  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 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Une contrainte d'intégrité de référence FOREIGN KEY ne peut se greffer que sur une autre contrainte :
    - soit de clef primaire PRIMARY KEY
    - soit d'unicité UNQIUE.

    Dans votre cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TABLE Correspondance (
    	id_a INTEGER,
    	id_b INTEGER,
    	CONSTRAINT pk_Correspondance PRIMARY KEY(id_a, id_b),
    	CONSTRAINT fk_Correspondance_Table1 FOREIGN KEY(id_a) REFERENCES Table1(id),
    	CONSTRAINT fk_Correspondance_Table2 FOREIGN KEY(id_b) REFERENCES Table1(id)
    );
    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/ * * * * *

Discussions similaires

  1. Forein key sur une partie de la primary key
    Par cmako dans le forum Développement
    Réponses: 2
    Dernier message: 10/02/2009, 11h54
  2. Primary Key sur mois et année d'une date
    Par Somato dans le forum SQLite
    Réponses: 4
    Dernier message: 19/06/2008, 17h57
  3. primary key sur plusieurs colonnes d'une table
    Par hotttttsauce dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/04/2008, 12h20
  4. comment savoir si une colonne est primary key d'une table?
    Par vinczente dans le forum Administration
    Réponses: 4
    Dernier message: 13/05/2007, 21h23
  5. [débutant] Aide pour mettre une FOREIGN KEY sur une table
    Par cauldron dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2004, 17h16

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