2011-12-26 2 views
0

J'ai une table avec trois colonnes, l'ID de la relation, l'ID de l'objet associé et la valeur de l'objet. La table peut avoir autant de relations ID-Valeur répétées sauf lorsque la valeur est 0 pour le même ID.Contrainte de colonne multiple

   Correct      Incorrect 
    +--------+--------+-------+ +--------+--------+-------+ 
    | PK_ID | ID | Value | | PK_ID | ID | Value | 
    +--------+--------+-------+ +--------+--------+-------+ 
    | 1 | 1 | 1 | | 1 | 1 | 1 | 
    | 2 | 1 | 1 | | 2 | 1 | 1 | 
    | 3 | 2 | 0 | | 3 | 2 | 0 | 
    +--------+--------+-------+ | 4 | 2 | 0 | 
            +--------+--------+-------+ 

La question est de savoir comment puis-je l'appliquer à ne pas laisser une relation ID-valeur répétée lorsque la valeur est 0?

+3

ne peut le faire avec une contrainte de vérification. Utilisez un index filtré ou une vue avec une contrainte unique en fonction de la version de SQL Server. –

+0

@Martin oui c'est exactement ce dont j'ai besoin, mais je suis sur SQL Server 05 – PedroC88

+1

Vous devez utiliser la technique de vue indexée alors. Il y a un exemple dans ma réponse dans le lien "duplicata possible". –

Répondre

0

Comme indiqué par @Martin Smith dans les commentaires de la question c'est en effet similaire à Simple CHECK Constraint not so simple et dans la réponse à cette question (bien que ce soit pour sql-08), il y a une solution par exemple pour sql-00 et 05.

l'idée est de créer une vue d'index pour simuler un index unique filtré avec le code suivant:

CREATE VIEW dbo.myTableView 
WITH SCHEMABINDING 
AS 
SELECT ID 
FROM dbo.myTable 
WHERE Value = 0 

GO 
CREATE UNIQUE CLUSTERED INDEX ix ON dbo.myTableView(ID) 
Questions connexes