2010-05-28 22 views
18

Cuando crea una restricción de clave externa en una tabla y crea la secuencia de comandos en MS SQL Management Studio, se ve así.Restricción de comprobación de clave externa de T-SQL

ALTER TABLE T1 WITH CHECK ADD CONSTRAINT FK_T1 FOREIGN KEY(project_id) 
REFERENCES T2 (project_id) 
GO 
ALTER TABLE T1 CHECK CONSTRAINT FK_T1 
GO 

Lo que no entiendo es qué propósito tiene la segunda alteración con restricción de verificación. ¿No está creando la restricción FK suficiente? ¿Tiene que agregar la restricción de verificación para asegurar la integridad de referencia?

Otra pregunta: ¿cómo se vería entonces cuando la escribiría directamente en la definición de la columna?

CREATE TABLE T1 (
my_column INT NOT NULL CONSTRAINT FK_T1 REFERENCES T2(my_column) 
) 

¿No es esto suficiente?

Respuesta

8

Primero crea la restricción y aquí puede especificar si los datos ya establecidos en la tabla deben marcarse o no contra su nueva restricción. WITH { CHECK | NOCHECK }

La segunda parte especifica que la restricción está habilitada. ALTER TABLE TableName { CHECK | NOCHECK } CONSTRAINT ConstraintName

+5

bien ... ¿y no estará habilitado por defecto? Porque en mi opinión ... si escribo una restricción al crear una tabla, debería estar habilitada de forma predeterminada. –

+0

Me gustaría obtener una respuesta para su segunda pregunta, toda la documentación que leo dice que la restricción fk hará cumplir la regla en las columnas existentes de forma predeterminada, por lo que creo que la segunda afirmación es innecesaria. – Ernesto

3

La segunda afirmación es obligada por "WITH CHECK" en la primera declaración. Hay una configuración que puede alternar para no hacer esto.

Cuestiones relacionadas