Journal Attention : SQL Foreign key

Posté par  .
Étiquettes : aucune
0
21
mai
2003
Voici mes tables (Postgres) :

Une table Langue qui decrit differentes langues :

CREATE TABLE Langue (
id SERIAL PRIMARY KEY,
intitule VARCHAR(30) NOT NULL
);


Une table qui fait reference à Langue, la "clée primaire" est la combinaison de 'id' et 'lang_id' :

CREATE TABLE Domaine (
id CHAR(3) NOT NULL,
intitule VARCHAR(60) NOT NULL ,
lang_id INTEGER NOT NULL REFERENCES Langue(id) ON DELETE RESTRICT,
CONSTRAINT domaine_langue PRIMARY KEY (id, lang_id)
);


Et attention une table "Groupe" qui veut faire reference à la "Langue" et à "domaine" :

CREATE TABLE Groupe (
id CHAR(4) NOT NULL,
intitule VARCHAR(60) NOT NULL,
domaine CHAR(3) NOT NULL :evil: :twisted: ,
lang_id INTEGER NOT NULL REFERENCES Langue(id) ON DELETE RESTRICT,
);


Le probleme est au niveau des petits demons, impossible de faire une REFERENCES (Foreign key) sur id de domaine puisqu'il n'est pas unique ce qui est normal...
Comment pourrait-on faire ?
J'espere que mes explicatoins sont claires...
Merci
  • # Re: Attention : SQL Foreign key

    Posté par  . Évalué à 1.

    En fait, je veux faire reference à une clé qui n'est pas unique !
  • # Re: Attention : SQL Foreign key

    Posté par  (site web personnel) . Évalué à 1.

    Pour une clé étrangère à plusieurs attributs, la syntaxe est la suivante: CREATE TABLE Groupe ( id CHAR(4) NOT NULL, intitule VARCHAR(60) NOT NULL, domaine CHAR(3) NOT NULL :evil: :twisted: , lang_id INTEGER NOT NULL REFERENCES Langue(id) ON DELETE RESTRICT, FOREIGN KEY (idn lang_id) REFERENCES Domaine ); Enfin je suis sûr que ça marche avec Oracle 8i (désolé, c'est ce qu'on utilise à la fac). Mais il me semble que cette synthaxe est une synthaxe SQL... Il me semble aussi qu'il n'y a pas besoin de préciser NOT NULL, car une clé étrangère est forcément not null...
  • # fr.usenet.abus.d

    Posté par  . Évalué à 1.

    Usenet c'était mieux avant.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.