2009-11-20 8 views
0

I ayant du mal à créer une clé étrangère dans sql 2005.clés étrangères dans le serveur SQL 2005

ma table clé primaire est une clé primaire qui couvre 2 colonnes.

Je souhaite créer ma clé étrangère afin qu'elle fasse référence à une colonne dans ma table principale, mais je souhaite spécifier une valeur statique pour la deuxième colonne - est-ce possible?

+0

pouvez-vous nous montrer les structures de table pour les deux tables, et comment vous avez essayé de créer la clé étrangère ?? –

Répondre

0

Non, vous ne pouvez pas le faire - si vous faites référence à une table de parent d'une table enfant, vous devez faire référence à toutes les colonnes de la clé primaire sur la table parent:

ALTER TABLE dbo.ChildTable 
    ADD CONSTRAINT FK_ChildTable_ParentTable 
    FOREIGN KEY (col1, col2) REFERENCES dbo.ParentTable(pkCol1, pkCol2) 

Vous ne pouvez pas introduire soudainement " statique "dans votre référence.

Ce que vous pouvez faire sur la table des enfants serait de mettre un CONTRAINTE CHECK sur cette deuxième colonne pour en faire une valeur « statique » - mais vous ne pouvez jamais avoir une autre valeur dans cette colonne:

ALTER TABLE dbo.ChildTable 
    ADD CONSTRAINT chk_col2_Static CHECK (col2 = 4) 

Est-ce ce que vous cherchez?

+1

merci pour votre réponse. Je suis heureux de référencer toutes les colonnes de la clé primaire - juste que je veux spécifier une valeur statique pour la 2ème colonne. produits de table par exemple primaire nom de type identifiant 1 pomme fruit 2 fruits orange 3 carotte veg ... Je peut vouloir une clé étrangère sur une colonne qui impose que les types de fruits. donc la clé étrangère référencera la colonne id mais aussi la colonne de clé primaire secondaire de type devrait être contrainte à produire des fruits. cela doit être un problème commun lors de l'utilisation d'une table «générique» avec une colonne «type» descriminator pour stocker des choses différentes – Bal

+0

@Bal: peut-être - mais c'est un design plutôt mauvais, à mon avis. Je ne connais aucun moyen de spécifier cela comme une contrainte de clé étrangère. –

+0

La seule option réelle que je vois est dans SQL Server ** 2008 ** seulement - avoir un index filtré unique sur la colonne de votre table principale où la deuxième colonne est = 1 - alors vous pourriez référencer cet index unique filtré de votre table enfant. C'est un peu un hack, mais ça marcherait probablement. –