Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1408 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Clé étrangère et double contraintes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Clé étrangère et double contraintes

n°964611
Charlux
Posté le 28-01-2005 à 13:00:14  profilanswer
 

Bonjour,
 
   Je souhaiterais avoir une clé étrangère dans une table X qui dépendent d'un champ d'un table Y OU Z
 
 
   Voilà le code que j'ai utilisé qui impose que la clé étrangère appartienne aux DEUX tables. Or, je voudrais qu'elle puisse appartenir à l'une OU à l'autre. Est-ce possible et avez-vous une solution?
 
Merci de vos réponses par avance...
 

Code :
  1. CREATE TABLE Y(
  2.    ChampY INTEGER,
  3. );
  4. CREATE TABLE Z(
  5.    ChampZ INTEGER
  6. );
  7. CREATE TABLE X(
  8.    ChampX INTEGER,
  9.    CONSTRAINT fk_essai1 FOREIGN KEY (ChampX) REFERENCES Y(ChampY),
  10.    CONSTRAINT fk_essai2 FOREIGN KEY (ChampX) REFERENCES Z(ChampZ),
  11. );

mood
Publicité
Posté le 28-01-2005 à 13:00:14  profilanswer
 

n°964614
albataur
Posté le 28-01-2005 à 13:10:36  profilanswer
 

Moi je dirais impossible mais sans garanties ...
T'utilises quel SGBD ?


Message édité par albataur le 28-01-2005 à 15:31:07
n°964624
Charlux
Posté le 28-01-2005 à 13:23:22  profilanswer
 

PostgreSQL

n°964627
sircam
I Like Trains
Posté le 28-01-2005 à 13:30:50  profilanswer
 

A ma connaissance, ce n'est pas possible (aussi sans garantie).
 
Tu peux passer par un trigger, qui garantira facilement cette contrainte d'intégrité.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°964950
Beegee
Posté le 28-01-2005 à 19:25:39  profilanswer
 

c'est pas très logique ce type de problème ... c'est probablement lié à un mauvais design des 2 tables en question.

n°964962
WhatDe
Posté le 28-01-2005 à 20:02:44  profilanswer
 

Beegee a écrit :

c'est pas très logique ce type de problème ... c'est probablement lié à un mauvais design des 2 tables en question.


Je dirais la même chose.
 
Charlux> en fait tu devrais mettre une clé étrangère dans Table Y et l'autre dans Table Z. Là tu n'auras forcément plus de problèmes.
 
Ce qui donne:

Code :
  1. CREATE TABLE Y(
  2.    ChampY INTEGER,
  3.  
  4.    CONSTRAINT fk_essai1 FOREIGN KEY (ChampY) REFERENCES X(ChampX),
  5. );
  6. CREATE TABLE Z(
  7.    ChampZ INTEGER
  8.    CONSTRAINT fk_essai2 FOREIGN KEY (ChampZ) REFERENCES X(ChampX),
  9. );
  10. CREATE TABLE X(
  11.    ChampX INTEGER,
  12. );


Message édité par WhatDe le 28-01-2005 à 20:05:44
n°965021
sircam
I Like Trains
Posté le 28-01-2005 à 21:35:43  profilanswer
 

Non, ce n'est pas forcément illogique.
 
Tu peux imaginer que X et Y représentent deux entités suffisamment différentes que pour constituer deux tables, car leurs attributs diffèrent, mais qu'elles ont qq chose en commun Z que tu ne veux pas recopier dans chacune des deux tables.
 
Je suis certain d'avoir eu le cas il y a un certain temps (un temps certain), et un sélecteur XOR s'était naturelement imposé.
 
Je dis pas, c'est pas hyper-fréquent et c'est un peu suspect a priori.
 
Charlux, que modélisent X, Y et Z stp ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°965089
Beegee
Posté le 28-01-2005 à 22:46:00  profilanswer
 

Le qqch en commun devrait logiquement se trouver dans une table à part ... :)

n°965114
sircam
I Like Trains
Posté le 28-01-2005 à 23:06:39  profilanswer
 

Beegee a écrit :

Le qqch en commun devrait logiquement se trouver dans une table à part ... :)


Beh oui, X en l'occurence (et non pas Z comme je l'ai dit plus haut; je m'emmêle les pinceaux avec ses lettres abstraites à cette heure-ci).
 
Enfin, s'il nous disait de quoi il retourne, on verrait bien. Et 95% de chances pour que ce ne soit pas le bon design, comme tu le dis.


Message édité par sircam le 28-01-2005 à 23:06:50

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°965217
Mara's dad
Yes I can !
Posté le 29-01-2005 à 00:16:08  profilanswer
 

Dans ce genre de cas, tu as 2 champs dans x, un pour y et un pour z, vu que y et z ne représentent pas la même chose.
 
Sinon, c'est qu'il faut mette y et z dans une seule et même table.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
mood
Publicité
Posté le 29-01-2005 à 00:16:08  profilanswer
 

n°965327
sircam
I Like Trains
Posté le 29-01-2005 à 11:49:25  profilanswer
 

Mara's dad a écrit :

Dans ce genre de cas, tu as 2 champs dans x, un pour y et un pour z, vu que y et z ne représentent pas la même chose.


*TILT* Le franc est tombé (heu l'euro).
 
Il propose un seul champs avec deux FK XOR, pas deux champs...  :heink: Y'avais pas vu, -1 pour moi.
 
Sorry, ça me paraissait tellement évident qu'il fallait 2 champs et ce truc a l'air tellement faux que je suis passé à côté!
 
Je me joins à vous. :jap:


Message édité par sircam le 29-01-2005 à 11:49:46

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°966956
Arjuna
Aircraft Ident.: F-MBSD
Posté le 31-01-2005 à 16:36:21  profilanswer
 

Tu peux essayer un truc idiot qui me vient à l'esprit. Je dirais qu'avec SQL Server 2000 et Oracle >= 9i y'a des chances que ça marche :
 

Code :
  1. CREATE TABLE Y(
  2.    ChampY INTEGER,
  3. );
  4. CREATE TABLE Z(
  5.    ChampZ INTEGER
  6. );
  7. CREATE VIEW MONTRUCDEBILE(
  8.    ChampRef INTEGER)
  9. AS
  10. SELECT ChampY ChampRef FROM Y
  11. UNION
  12. SELECT ChampZ ChampRef FROM Z;
  13. CREATE TABLE X(
  14.    ChampX INTEGER,
  15.    CONSTRAINT fk_essaidebile FOREIGN KEY (ChampX) REFERENCES MONTRUCDEBILE(ChampRef)
  16. );


 
Mais logiquement, une clé externe ne peut porter que sur une table et non pas une vue. Dans tous les cas, si ton SGBD le supporte, il faudra lui expliciter que c'est sur une vue que porte la référence, et non pas une table.

n°966958
Arjuna
Aircraft Ident.: F-MBSD
Posté le 31-01-2005 à 16:38:43  profilanswer
 

En extrapolant sur la doc de SQL Server 2000, tu peux peut-être aussi tenter ça :
 

Code :
  1. CREATE TABLE cust_sample
  2.     (
  3.     cust_id                int        PRIMARY KEY,
  4.     cust_name            char(50),
  5.     cust_address            char(50),
  6.     cust_credit_limit    money,
  7.     CONSTRAINT chk_id CHECK (cust_id in (select champY val from Y UNION select champZ val from Z)
  8.     )

n°966965
Arjuna
Aircraft Ident.: F-MBSD
Posté le 31-01-2005 à 16:43:22  profilanswer
 

D'après la doc de SQL Server 2000, ça semble rappé pour la contrainte CHECK qui utilise une autre table (select) :
 

Citation :


Contraintes CHECK
Une colonne peut posséder un nombre illimité de contraintes CHECK et la condition peut inclure plusieurs expressions logiques combinées par AND et OR. S'il existe plusieurs contraintes CHECK pour une même colonne, elles sont validées dans l'ordre de leur création.
 
 
La condition de recherche doit correspondre à une expression booléenne et ne peut pas faire référence à une autre table.
 
 
Une contrainte CHECK de niveau colonne ne peut faire référence qu'à la colonne contenant la contrainte, et une contrainte CHECK de niveau table ne peut faire référence qu'aux colonnes d'une même table.  
Les contraintes CHECK et les règles servent toutes les deux à valider les données lors des instructions INSERT et DELETE.
 
Quand il existe une règle et une ou plusieurs contraintes CHECK pour une colonne, toutes les restrictions sont évaluées.  


 
T'as plus qu'à faire un trigger je pense :D
 
 
 
Pas contre, la FK sur une vue, rien n'est spécifié dans l'aide. Même si le mot "table" est utilisé tous les deux mots, jamais il est spécifié qu'il faut que ce soit obligatoirement une table :D A tester donc ;)


Message édité par Arjuna le 31-01-2005 à 16:46:11

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Clé étrangère et double contraintes

 

Sujets relatifs
double, float, int : resultat inattendu sur un castrandom double
[DOS] Récupérer valeur d'une clé de registre[usb linux ]commandes de clé usb
[usb bulk] endpoint 1 IN de ma clé usb (broken pipe)colonne défini comme clef primaire et clef étrangère, possible ??
[PHP][SQL]Double insertion et récuperation de champ[C] Convertion double -> dec -> hex
Tableau a double entréeAUTORUN sur clé USB
Plus de sujets relatifs à : Clé étrangère et double contraintes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR