2010-07-27 6 views
1

Database est MS SQLServercontrainte de vérification pour une colonne de drapeau

Exemple de données:

 
| Name | defaultValue | value | 
| one |  true  | valone | 
| one |  false | valtwo | 
| one |  false | valthree | 

Je suis après une façon de contraindre la table de sorte que chaque « nom » ne peut avoir une ligne avec ' set « defaultValue true

Répondre

1

Créer une colonne calculée comme suit:

ALTER TABLE yourtable 
    ADD ValueCheck AS CASE defaultValue 
    WHEN true THEN 1 
    WHEN false THEN NULL 
    END 

puis ajoutez con uniques straint for (Name, ValueCheck)

+0

I + 1ed this mais ensuite réalisé que cela ne fonctionne pas. Les contraintes uniques dans SQL Server autorisent uniquement 1 NULL. –

+0

Vous avez raison. :( –

+0

Si yourtable a une colonne de clé (par exemple, keyid), alors changer NULL à keyid ci-dessus devrait fonctionner –

0

Vous pouvez utiliser un TRIGGER pour valider cette contrainte lors de la mise à jour ou de l'insertion d'événements et annuler la transaction si elle n'était pas valide.

+0

Mais assurez-vous de prendre en compte les effets de l'isolement snapshot http://sqlblog.com/blogs/hugo_kornelis/archive/tags/Isolation/default.aspx –

1

J'ai aimé l'idée de Michael mais cela ne vous permettra qu'une seule fausse valeur par nom dans SQL Server. Pour éviter cela comment sur l'utilisation

ALTER TABLE yourtable 
    ADD [ValueCheck] AS 
    (case [defaultValue] when (1) then ('~Default#[email protected]') /*Magic string!*/ 
       else value end) persisted 

puis ajouter la contrainte unique pour (Nom, ValueCheck).

Je suppose que le nom, les combinaisons de valeurs seront uniques. Si la colonne de valeur n'autorise pas les valeurs NULL, utiliser NULL plutôt que la chaîne magique serait préférable sinon choisir une chaîne qui ne peut pas apparaître dans les données (par exemple 101 caractères si la colonne de valeur n'autorise que 100 caractères)

Questions connexes