Введение в программирование SQL Server. Создание и управление базой данных. Инструменты целостности данных, страница 22

Следующий пример использует вторичный ключ для гарантирования, что идентификация покупателя в таблице Orders связана с действительным идентификатором таблицы Customers.

USE Northwind

ALTER TABLE dbo.Orders

ADD

CONSTRAINT FK_Orders_Customers

FOREIGN KEY (CustomerIT)

REFERENCES dbo.Customers(CustomerID)

Рассматривайте следующие факты об ограничении FOREIGN KEY:

*  Оно обеспечивает ссылочную целостность одной или нескольких колонок. Количество колонок и тип данных вторичного ключа, должны соответствовать количеству колонок и типу данных во вторичном ключе;

*  В отличие от первичного ключа и ограничения уникальности, вторичный ключ не создаёт индексов автоматически. Однако, если у вас будет много связей в базе данных, вы должны создать индексы для повышения производительности.

*  Для изменения ключа, пользователь должен иметь права на обе таблицы.

Целостность каскадных ссылок

Ограничение вторичного ключа включает опцию CASCADE, которая позволяет любые изменения сделанные в уникальной колонке или первичном ключе автоматически переносить в значение вторичного ключа. Такое действие называется целостностью каскадных ссылок.

Опция REFERENCE команд CREATE TABLE и ALTER TABLE поддерживаю опции ON DELETE и ON UPDATE. Эти опции позволят вам указать опции CASCADE и NO ACTION.

[ ON DELETE { CASCADE | NO ACTION } ]

[ ON UPDATE { CASCADE | NO ACTION } ]

NO ACTION указывает что любые попытки удалить или обновить ключ на который ссылается вторичный ключ в другой таблице заканчиваются ошибкой, и изменения откатываются. Это значение по умолчанию.

Рассматривайте следующие факты, когда назначаете опцию CASCADE:

*  Возможно комбинирование CASCADE и NO ACTION в таблице, которая имеет ссылочные отношения с другой. Если сервер находит NO ACTION то он прерывает и откатывает действия CASCADE.

*  Опция CASCADE не может быть назначена любым вторичным или первичным ключам, которые объявлены как rowversion.

5.4 Отключение ограничений

Для повышения производительности, иногда разумно отключить ограничения. Для примера, более эффективно позволить выполнить большую операцию обновления или вставки данных, прежде чем включать ограничения. В этой секции будет описано, как отключить проверку ограничения.

Отключение проверки ограничений на существующих данных

Когда вы определяете ограничение на таблицу, которая уже содержит данные, SQL Server проверяет данные автоматически, проверяя, чтобы существующие данные соответствовали требованиям. Однако, вы можете отключить проверку на существующие данные, когда добавляете ограничение на таблицу.

Рассматривайте следующие факты и рекомендации на отключение ограничений на существующие данные:

*  Вы можете отключить только ограничения CHECK и FOREIGN KEY. Другие ограничения должны быть удалены и потом снова добавлены.

*  Для отключения проверки, когда вы добавляете ограничения CHECK и FOREIGN KEY на таблицу с существующими данными, включите опцию WITH NOCHECK в оператор ALTER TABLE.

*  Используйте опцию WITH NOCHECK, если данные не будут изменяться. Данные должны соответствовать ограничению CHECK, если данные обновятся.

*  Убедитесь, что соответствующее отключению ограничение проверяется. Вы можете выполнить запрос на изменение данных, прежде чем решитесь добавить ограничение.

Пример

В этом примере, вы добавите ограничение FOREING KEY для проверки того, что все работники связаны с существующим менеджером. Ограничение не проверяет существующие данные на момент добавления ограничения:

USE Northwind

ALTER TABLE dbo.Employees

WITH NOCHECK

ADD CONSTRAINT FK_Employees

FOREIGN KEY (ReportsTo)

REFERENCES dbo.Employees(EmployeeID)

Отключение проверки ограничений, при загрузке данных

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

*  Вы уже убедились, что данные соответствуют требованиям;