2010-03-09 3 views
4

Je n'arrive pas à déterminer comment créer une contrainte de clé étrangère. Mon modèle de données est fixe et hors de mon contrôle, il ressemble à ceci:Contraintes de clé étrangère conditionnelles SQL Server

CREATE TABLE Enquiry 
    (Enquiry_Ref INTEGER PRIMARY KEY CLUSTERED, Join_Ref INTEGER, EnquiryDate, EnquiryType...) 

CREATE TABLE Contact 
    (Contact_Ref INTEGER PRIMARY KEY CLUSTERED, Surname, Forenames ....) 

CREATE TABLE UniversalJoin 
    (Join_Ref INTEGER, Contact_Ref INTEGER, Rel_Type INTEGER) 

Chaque enquête sur a exactement un contact. Le lien entre les deux est la table UniversalJoin où

Enquiry.Join_Ref = UniversalJoin.Join_Ref AND 
Rel_Type = 1 AND 
UniversalJoin.Contact_Ref = Contact.Contact_Ref 

Le Rel_Type varie en fonction de ce que la table source est, donc dans le cas d'enquête, Rel_Type est 1, mais pour une autre table, il fixerait à N.

Ma question est comment puis-je créer une contrainte de clé étrangère pour renforcer l'intégrité de cette relation? Ce que je veux dire, mais ne peut pas, est:

CREATE TABLE Enquiry 
    ... 
    CONSTRAINT FK_Foo 
    FOREIGN KEY (Join_Ref) 
    REFERENCES UniversalJoin (JoinRef WHERE Rel_Type=1) 
+3

C'est un odd datamodel ... – Paddy

Répondre

3

Vous ne pouvez pas utiliser les clés étrangères conditionnelles ou filtrés dans SQL Server

Dans ces cas, vous pourriez avoir un multiple colonne FK entre (JoinRef, Rel_Type) et définir une contrainte de vérification sur Rel_Type dans UniversalJoin à make it 1.

Cependant, je pense que vous essayez d'avoir une rangée avec plusieurs parents qui ne peut pas être fait.

3

Vous pourriez plutôt vouloir jeter un oeil à CHECK Constraints

contraintes CHECK respectent l'intégrité domaine en limitant les valeurs sont acceptées par une colonne. Ils sont similaires aux contraintes FOREIGN KEY dans qu'ils contrôlent les valeurs qui sont mis dans une colonne. La différence est dans comment ils déterminent quelles valeurs sont valides: Les contraintes FOREIGN KEY obtenir la liste des valeurs valides d'une autre table , et contrôleront les contraintes déterminent les valeurs valides à partir d'une expression logique qui ne repose pas sur des données dans une autre colonne.

0

Vous pouvez utiliser un déclencheur de table avec INSERT et Update pour superposer l'équivalent en FK. De cette manière, vous pouvez appliquer des conditions, c'est-à-dire si la valeur de la colonne = 1 existe dans la table a si la valeur de la colonne = 2, puis vérifiez une autre table.

Questions connexes