2010-08-09 5 views
18

J'utilise SQL Server 2008sur plusieurs VERIFIER CONTRAINTE colonnes

J'utilise un CONTRAINTE CHECK sur plusieurs colonnes de la même table pour essayer de valider la saisie de données.

Je reçois une erreur:

Column CHECK constraint for column 'AAAA' references another column, table 'XXXX'.

CONTRAINTE ne fonctionne CHÈQUE pas de cette façon. Toute autre façon d'implémenter cela sur une seule table sans utiliser FK?

Merci

Voici un exemple de mon code

CREATE TABLE dbo.Test 
( 
EffectiveStartDate dateTime2(2)  NOT NULL, 
EffectiveEndDate dateTime2(2)  NOT NULL 
    CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate), 
); 
+2

Pourquoi "sans FK" ?? Les clés étrangères sont ** conçues ** pour relier deux tables - c'est leur compétence de base, leur travail, leur raison d'être - pourquoi ne pas utiliser FK quand c'est vraiment le travail d'un FK? –

+0

J'ai ajouté mon code à ma question, j'espère maintenant avoir plus de sens. – GibboK

Répondre

40

Oui, définir CHECK CONSTRAINT à la table niveau

CREATE TABLE foo (
    bar int NOT NULL, 
    fred varchar(50) NOT NULL, 

    CONSTRAINT CK_foo_stuff CHECK (bar = 1 AND fred ='fish') 
) 

Vous déclarez qu'il en ligne comme une colonne contrainte

... 
fred varchar(50) NOT NULL CONSTRAINT CK_foo_fred CHECK (...) 
... 

Modifier, plus facile à publier qu'à décrire. Correction de vos virgules.

CREATE TABLE dbo.Test 
( 
    EffectiveStartDate dateTime2(2)  NOT NULL, 
    EffectiveEndDate dateTime2(2)  NOT NULL, --need comma 
    CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate) --no comma 
); 

Bien sûr, les restes de question utilisez-vous une contrainte CHECK où il devrait être une contrainte FK ...?

+0

Salut j'ai testé votre code et son travail, j'ai posté mon sur ma question originale, car il est très similaire, mais ne fonctionne pas. Des idées? merci pour votre temps – GibboK

+0

+1 bien que je dirais que logiquement la contrainte est définie au niveau de la ligne. Une contrainte CHECK au niveau de la table serait capable de référencer des données dans des lignes différentes dans la même table, ce que SQL Server ne prend pas en charge directement. – onedaywhen

+0

@onedaywhen: Une contrainte CK est * toujours * par ligne. "niveau de table" se réfère à attaché à la table, plutôt qu'attaché à une colonne. – gbn

2

Les contraintes de vérification peuvent faire référence à une seule colonne ou à l'ensemble de l'enregistrement.

Utilisez cette syntaxe pour les contraintes au niveau record:

ALTER TABLE MyTable 
ADD CONSTRAINT MyCheck 
CHECK (...your check expression...) 
1

Vous pouvez simplement appliquer votre validation dans un déclencheur sur la table en particulier que de toute façon l'opération sera annulée si le contrôle a échoué.

Questions connexes