2017-10-19 6 views
3

Je voudrais avoir une contrainte conditionnelle à ma base de données:contrainte SQL conditionnelle sur plusieurs colonnes étant uniques

enter image description here

Vous pouvez voir que ma colonne CreatedBy a quelques entrées manquantes en raison de problèmes de données existants.

Mon nouveau code m'assure que le CreatedBy est rempli.

Question:

Je voudrais faire en sorte que personne ne peut entrer dans les entrées en double dans la db en ajoutant une contrainte conditionnelle. qui définit qu'une ligne doit être unique par AnswerID, PollID et CreatedBy ... que si CreatedBy est pas vide

Il pourrait ressembler à ceci:

CONSTRAINT UNIQUE BY AnswerID, PollID, CreatedBy WHERE CreatedBy IS NOT NULL 

Toutes les idées s'il est possible?

+0

@a_horse_with_no_name - Merci, j'espère que ça aide – Jimmyt1988

Répondre

5

Bien sûr, utiliser un filtered index:

CREATE UNIQUE NONCLUSTERED INDEX <indexName> 
    ON <tableName> (AnswerID, PollID, CreatedBy) 
    WHERE CreatedBy IS NOT NULL; 

Ou, puisque vous avez dit "non vide" alors quelque chose comme cela devrait faire:

CREATE UNIQUE NONCLUSTERED INDEX <indexName> 
    ON <tableName> (AnswerID, PollID, CreatedBy) 
    WHERE CreatedBy IS NOT NULL 
     AND CreatedBy <> N''; 
+2

C'est ... c'est beau (essuie les larmes du visage). Merci, je vais essayer maintenant! – Jimmyt1988

0

Si la version est antérieure à 2008:

CREATE VIEW dbo.vw_Tablename 
WITH SCHEMABINDING AS 
SELECT AnswerID, PollID, CreatedBy 
FROM dbo.Tablename 
WHERE CreatedBy IS NOT NULL; 

GO 

CREATE UNIQUE CLUSTERED INDEX UIX_vw_Tablename 
    ON dbo.vw_Tablename(AnswerID, PollID, CreatedBy)