2012-04-02 3 views
20

Если I сценарий таблица с внешним ключом, это выглядит следующим образом:ALTER TABLE [DBO] [MyTable] ПРОВЕРКА CONSTRAINT [FK_MyTable_SomeCol]

GO 
ALTER TABLE [dbo].[MyTable] WITH CHECK ADD CONSTRAINT [FK_MyTable_SomeCol] FOREIGN KEY([SomeCol]) 
REFERENCES [dbo].[MyOtherTable] ([SomeCol]) 
GO 
ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol] 
GO 

Что такое вторая часть для (ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol])?

+0

Я не вижу второго оператора при написании таблицы с внешним ключом (SQL Server 2008 R2). Вы уверены, что первый не содержит ** 'WITH NOCHECK' ** вместо' WITH CHECK'? –

+0

Да, это С NOCHECK. Теперь его функциональность более понятна мне. Спасибо вам всем! – yonexbat

ответ

19

Это артефакт, связанный с тем, что ограничение связано с скриптом - хотя нет необходимости указывать эти параметры (поскольку они являются значениями по умолчанию для новых ограничений), тот же генератор также может генерировать параметры NOCHECK точно так же.

Documentation для ALTER TABLE показывает два различных использования CHECK/NOCHECK:

WITH CHECK | WITH NOCHECK

Указывает, должны ли данные в таблице, либо не сверяются вновь добавлены или повторном включении FOREIGN KEY или CHECK ограничение. Если не указано, для новых ограничений принимается WITH CHECK, а для повторно включенных ограничений принимается WITH NOCHECK.

И:

{ CHECK | NOCHECK } CONSTRAINT

Указывает, что constraint_name включена или отключена.

Таким образом, один из вариантов говорит «проверить текущее содержимое таблицы», а другой - «Проверять новые данные по мере их добавления».

Смежные вопросы