Добавление внешнего ключа завершается ошибкой, если данные не будут сначала удалены и повторно вставлены после

#sql #constraints #sql-server-2016

#sql #ограничения #sql-server-2016

Вопрос:

У меня странная проблема с внешними ключами. Я пытаюсь выполнить следующий запрос:

 ALTER TABLE [GroupMember] FOREIGN KEY ([Group]) REFERENCES [Group]([GUID])
  

Что дает мне следующую ошибку:

Оператор ALTER TABLE конфликтовал с ограничением ВНЕШНЕГО КЛЮЧА «FK__GroupMember__Group__0D25C822». Конфликт произошел в базе данных «x», таблица «dbo.Group», столбец «GUID».

Затем я проверил существующие вещи, которые, как я подтвердил, все в порядке:

  • Таблица, на которую ссылается (dbo.Group), имеет определенный ПЕРВИЧНЫЙ КЛЮЧ в столбце [GUID]
  • Таблица ссылок (dbo.GroupMember) не имеет [Group]-значений, которые не существуют в [GUID]-столбце dbo.Group-table
  • Подобных ссылающихся внешних ключей уже не существует

С этого момента я экспериментировал. Ввод и удаление некоторых строк, очистка таблицы, усечение таблицы. Что я могу сделать до сих пор:

  • Если я удалю таблицу ссылок с помощью DELETE FROM [GroupMember]; , а затем попытаюсь применить ограничение FK, я получу то же сообщение об ошибке
  • Если я усекаю таблицу ссылок с помощью TRUNCATE TABLE [GroupMember]; , я могу применить ограничение FK без ошибок. Кроме того, я могу без проблем повторно вставить точно такие же данные после применения ограничения FK.

Из этого я могу сделать вывод, что сами данные не являются проблемой. Кто-нибудь может разобраться в этом? Почему я могу применить ограничение после усечения таблицы, но не после удаления всех записей?

Комментарии:

1. Вы пробовали использовать WITH NOCHECK опцию с alter table инструкцией?

2. Привет, Тодд. Если я добавлю ограничение с помощью подсказки NOCHECK, это сработает.

3. Допускает ли ваш столбец значения NULL?

4. Привет, Вуозар. Ссылочный столбец имеет значение null, ссылочный столбец является ненулевым столбцом с кластеризованным PK. Я попытался удалить все ссылочные столбцы с NULL, но это не помогает.

Ответ №1:

Если вы используете Microsoft SSMS, проверьте, решает ли проблему снятие флажка «Запретить сохранение изменений, требующих повторного создания таблицы». Вы найдете это в Настройках> Конструкторы> Таблицы и Конструкторы базы данных.

У меня были похожие проблемы, которые были решены этим. Дайте мне знать, работает это или нет.

Удачи.

Комментарии:

1. Привет, и спасибо за ваш ответ. Я также сталкивался с проблемами с этой опцией в прошлом, поэтому она была отключена на некоторое время, я дважды проверил ее сейчас.