Отключение ограничений внешнего ключа с помощью инструкций INSERT и UPDATE
Вы можете отключить ограничение внешнего ключа во время транзакций INSERT и UPDATE в SQL Server с помощью SQL Server Management Studio или Transact-SQL. Используйте эту возможность, если новые данные не будут нарушать существующее ограничение или если ограничение относится только к данным, уже помещенным в базу данных.
ограничения
После отключения этих ограничений будущие вставки и обновления столбца не проверяются по проверочным ограничениям.
Permissions
Требуется разрешение ALTER на таблицу.
Использование SQL Server Management Studio
Отключение ограничений внешнего ключа для инструкций INSERT и UPDATE
- Разверните в обозревателе объектовтаблицу с ограничением, затем разверните папку Ключи .
- Щелкните правой кнопкой мыши ограничение и выберите команду Изменить.
- В сетке под конструктором таблиц выберите Принудительное использование ограничения внешнего ключа и выберите значение Нет в раскрывающемся меню.
- Выберите Закрыть.
- Чтобы повторно включить ограничение при необходимости, выполните указанные выше шаги. Выберите Принудительное использование ограничения внешнего ключа и выберите значение Да в раскрывающемся меню.
- Чтобы доверять ограничению, проверив существующие данные в связи внешнего ключа, выберите Проверить существующие данные при создании или повторном включении и выберите Да в раскрывающемся меню. Это обеспечит доверие к ограничению внешнего ключа.
- Если параметр Проверить существующие данные при создании или повторном включении имеет значение Нет, внешний ключ не проверка существующие данные при повторном включении. Поэтому оптимизатор запросов не может учитывать потенциальные улучшения производительности. Рекомендуется использовать доверенные внешние ключи, так как их можно использовать для упрощения планов выполнения с помощью предположений, основанных на ограничении внешнего ключа. Чтобы проверка, являются ли внешние ключи доверенными в базе данных, см. пример запроса далее в этой статье.
Использование Transact-SQL
Отключение ограничений внешнего ключа для инструкций INSERT и UPDATE
- В обозревателе объектовподключитесь к экземпляру компонента Компонент Database Engine.
- На стандартной панели выберите пункт Создать запрос.
- Скопируйте приведенный ниже пример в окно запроса и нажмите кнопку Выполнить.
USE AdventureWorks2022; GO ALTER TABLE Purchasing.PurchaseOrderHeader NOCHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID; GO
USE AdventureWorks2022; GO ALTER TABLE Purchasing.PurchaseOrderHeader CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID; GO
SELECT o.name, fk.name, fk.is_not_trusted, fk.is_disabled FROM sys.foreign_keys AS fk INNER JOIN sys.objects AS o ON fk.parent_object_id = o.object_id WHERE fk.name = 'FK_PurchaseOrderHeader_Employee_EmployeeID'; GO
Если существующие данные в таблице соответствуют ограничению внешнего ключа, необходимо задать для ограничения внешнего ключа значение trusted. Чтобы задать для внешнего ключа доверенный, используйте следующий скрипт, чтобы снова доверять ограничению внешнего ключа, отметив дополнительный WITH CHECK синтаксис. Скопируйте приведенный ниже пример в окно запроса и нажмите кнопку Выполнить.
ALTER TABLE [Purchasing].[PurchaseOrderHeader] WITH CHECK CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID; GO
Дальнейшие действия
- ALTER TABLE (Transact-SQL)
- Просмотр свойств внешнего ключа
Удаление связей внешнего ключа
Ограничение внешнего ключа в SQL Server можно удалить с помощью SQL Server Management Studio или Transact-SQL. При удалении ограничения внешнего ключа удаляется требование принудительного создания ссылочной целостности.
Ссылки на внешние ключи в других таблицах см. в разделе «Ограничения первичного и внешнего ключа».
Разрешения
Требуется разрешение ALTER на таблицу.
Использование SQL Server Management Studio
Удаление ограничения внешнего ключа
- Разверните в обозревателе объектовтаблицу с ограничением, после чего разверните узел Ключи.
- Щелкните правой кнопкой мыши ограничение и нажмите кнопку «Удалить«.
- В диалоговом окне «Удалить объект» нажмите кнопку «ОК«.
Использование Transact-SQL
Удаление ограничения внешнего ключа
- В обозревателе объектов подключитесь к экземпляру ядра СУБД.
- На стандартной панели выберите пункт Создать запрос.
- Скопируйте приведенный ниже пример в окно запроса и нажмите кнопку Выполнить.
USE AdventureWorks2022; GO ALTER TABLE dbo.DocExe DROP CONSTRAINT FK_Column_B; GO
Дополнительные сведения см. в разделе ALTER TABLE (Transact-SQL).
Следующие шаги
- Инструкция ALTER TABLE (Transact-SQL)
- sys.key_constraints (Transact-SQL)
- Создание связей по внешнему ключу
- Изменение связей по внешнему ключу
Drop a Foreign Key SQL Server
В этом учебном пособии вы узнаете, как удалять внешний ключа в SQL Server (Transact-SQL) с синтаксисом и примерами.
Описание
После создания foreign key, вам может быть понадобится удалить foreign key из таблицы. Вы можете сделать это с помощью оператора ALTER TABLE в SQL Server (Transact-SQL).
Синтаксис
Синтаксис удаления внешнего ключа в SQL Server (Transact-SQL):
ALTER TABLE table_name
DROP CONSTRAINT fk_name;
Параметры или аргументы
table_name — имя таблицы, в которой был создан внешний ключ.
fk_name — имя внешнего ключа, который вы хотите удалить.
Пример
Рассмотрим пример того, как удалить внешний ключ в SQL Server (Transact-SQL).
Например, если вы создали внешний ключ следующим образом:
Transact-SQL
CREATE TABLE products
( product_id INT PRIMARY KEY ,
product_name VARCHAR ( 50 ) NOT NULL ,
category VARCHAR ( 25 )
CREATE TABLE inventory
( inventory_id INT PRIMARY KEY ,
product_id INT NOT NULL ,
quantity INT ,
min_level INT ,
max_level INT ,
CONSTRAINT fk_inv_product_id
FOREIGN KEY ( product_id )
REFERENCES products ( product_id )
В этом примере внешнего ключа мы создали родительскую таблицу products . Таблица products имеет первичный ключ, который состоит из поля product_id .
Затем мы создали вторую таблицу под названием inventory , которая в этом примере внешнего ключа будет дочерней таблицей. Мы использовали оператор CREATE TABLE для создания внешнего ключа fk_inv_product_id в таблице inventory . Внешний ключ устанавливает связь между столбцом product_id в таблице inventory и столбцом product_id в таблице products .
Если необходимо удалить внешний ключ с наименованием fk_inv_product_id , то нужно выполнить следующую команду:
Ссылочная целостность: внешний ключ (FOREIGN KEY) стр. 3
Для удаления ограничения также используется оператор ALTER TABLE :
Вот где нам понадобилось имя ограничения! Давайте удалим внешний ключ из таблицы PC.
Примечание:
При удалении внешнего ключа сами столбцы не удаляются, удаляется лишь ограничение. Это также справедливо и для других ограничений.
Создадим теперь новое ограничение, использующее каскадное удаление:
4. Изменение значений столбцов в главной таблице, с которыми связан внешний ключ в подчиненной таблице, т.е. тех столбцов, которые указаны в предложении REFERENCES ограничения FOREIGN KEY . Здесь действуют те же варианты, что и в случае с удалением строки из главной таблицы, только опция вводится предложением
При помощи внешнего ключа, как и других ограничений, мы моделируем связи, которые существуют в предметной области. Поэтому выбор опций определяется именно предметной областью. В нашем случае при изменении номера модели в таблице Product естественно создать ограничение с опцией CASCADE , чтобы это изменение проникало в продукционные таблицы, удаляя изделия аннулированной модели, т.е. для таблицы PC нам следует написать:
Однако для другой предметной области каскадное удаление может привести к ошибочной потере данных. Пусть, например, для таблиц Сотрудники и Отделы существует связь по номеру отдела. Если при удалении (расформировании) отдела сотрудники не увольняются, а переводятся в другие отделы, то каскадное удаление ошибочно привело бы к удалению информации о сотрудниках, работавших в этом отделе. Здесь подошел бы вариант NO ACTION – чтобы сначала распределить сотрудников по другим отделам, а потом удалить «пустой» отдел; или вариант SET NULL, т.е. сначала удаляем отдел, а потом занимаемся трудоустройством сотрудников, не приписанных ни к какому отделу. Еще раз повторю, что выбор варианта зависит не от предпочтений программиста, а от процессов, имеющих место в реальном мире.
1. Между таблицами Product и PC выше мы реализовали связь «один ко многим». Связь «один к одному» создается в случае, когда в подчиненной таблице внешним ключом является уникальный столбец или уникальная комбинация столбцов. В ряде случаев связь «один к одному» является ошибкой проектирования, поскольку фактически одна сущность разбивается на две. Однако для такого разделения иногда имеются веские основания, например, когда с целью повышения производительности или обеспечения безопасности приходится выполнить вертикальное секционирование (partitioning) таблицы.
2. При удалении ограничения необходимо знать его имя. Однако, как мы уже знаем, можно создать ограничение, не давая ему имени. Как быть в этом случае? Если мы явно не указываем имя ограничения, его генерирует система. Поэтому имя всегда есть. Другой вопрос, что мы его не знаем. Тут уместно сказать, что в реляционных системах метаданные хранятся так же, как и данные, т.е. в таблицах. Стандартным представлением метаданных является информационная схема, к которой можно адресовать обычные запросы на выборку. Не углубляясь в детали, напишем запрос, который вернет нам имя ограничения внешнего ключа для таблицы PC:
