2010-08-09 14 views
18

que utilizar SQL Server 2008restricción CHECK en múltiples columnas

utilizo una restricción CHECK en múltiples columnas en la misma mesa para tratar de validar la entrada de datos.

recibo un error:

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

restricción CHECK no funciona de esta manera.

Cualquier otra forma de implementar esto en una sola tabla sin usar FK?

Gracias

Aquí un ejemplo de mi código

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

¿Por qué "sin FK" ?? Las claves extranjeras están ** diseñadas ** para enlazar dos tablas: esa es su competencia central, su trabajo, su razón de ser, ¿por qué no utilizar FK cuando realmente es un trabajo de FK? –

+0

Agregué mi código a mi pregunta, espero que ahora tenga más sentido. – GibboK

Respuesta

40

Sí, definir la restricción CHECK en el nivel mesa

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

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

está declarando que en línea como una columna restricción

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

Editar, más fácil de publicar de describir. Reparado tus comas.

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 
); 

Por supuesto, la pregunta sigue siendo ¿Está utilizando una restricción CHECK donde debe ser una restricción FK ...?

+0

hola probé tu código y su funcionamiento, publiqué mi en mi pregunta original porque es muy similar pero no funciona. ¿Algunas ideas? gracias por su tiempo – GibboK

+0

+1, aunque yo diría que lógicamente la restricción se define en el nivel de la fila. Una restricción CHECK de nivel de tabla podría hacer referencia a datos en filas diferentes en la misma tabla, algo que SQL Server no admite directamente. – onedaywhen

+0

@onedaywhen: Una restricción CK es * siempre * por fila. "nivel de la tabla" se refiere a unir a la tabla, en lugar de adjuntarlo a una columna. – gbn

2

Verificar restricciones pueden referirse a una sola columna o de todo el disco.

Utilice esta sintaxis para las restricciones a nivel de registro:

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

puede simplemente aplicar su validación en un desencadenador en la tabla especial que en cualquier caso la operación se revertirá si el cheque no.

Cuestiones relacionadas