Оператор INSERT конфликтует с ограничением FOREIGN KEY - SQL Server

225

Я получаю следующую ошибку. Не могли бы вы мне помочь?

Сообщение 547, уровень 16, состояние 0, строка 1
Оператор INSERT конфликтует с ограничением FOREIGN KEY "FK_Sup_Item_Sup_Item_Cat". Конфликт произошел в базе данных "dev_bo", таблица "dbo.Sup_Item_Cat". Заявление было прекращено.

Код:

insert into sup_item (supplier_id, sup_item_id, name, sup_item_cat_id, 
                      status_code, last_modified_user_id, last_modified_timestamp, client_id)   
values (10162425, 10, 'jaiso', '123123',
        'a', '12', '2010-12-12', '1062425')

Последний столбец client_idвызывает ошибку. Я попытался поместить значение, которое уже существует в dbo.Sup_Item_Catстолбце, в соответствии с sup_item .. но не радость :-(

SmartestVEGA
источник
20
Вы попытались вставить в таблицу элементов запись, в которой нет соответствующей записи категории Sup_Item_Cat. Больше нечего сказать по этому поводу.
Мартин Смит
1
Так вы говорите, что SELECT * FROM Sup_Item_Cat WHERE sup_item_cat_id = '123123'возвращает результаты?
Мартин Смит
2
Также вы говорите "последний кулум" client_id "я получаю конфликт". Это не то, что подразумевается в сообщении об ошибке. Я думаю, что вы ищете не в том месте для вашей проблемы.
Мартин Смит

Ответы:

287

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

Если у вас есть SQL Server Management Studio, откройте его и sp_help' dbo.Sup_Item_Cat'. Посмотрите, к какому столбцу относится этот FK, и на какой столбец какой таблицы он ссылается. Вы вставляете некоторые плохие данные.

Дайте мне знать, если вам нужно что-то объяснить лучше!

Майк М.
источник
10
Спасибо за включение команды sp_help! Помог мне сузить мою похожую проблему.
Gaʀʀʏ
На самом деле - в моем случае свойство просто не отправлялось обратно из представления в контроллер, поэтому оно всегда было 0 (что не было допустимым идентификатором, но у контроллера не было бы возможности узнать это).
neminem
1
Alt + F1 - это ярлык для sp_help, для читателей будущего выберите таблицу и нажмите alt + f1
satsvelke
133

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

Несмотря на то, что проверенный ответ является правильным

Майк М написал

«Способ работы FK заключается в том, что он не может иметь значение в этом столбце, которого нет также в столбце первичного ключа в указанной таблице».

Чего не хватает в этом ответе просто;

Сначала вы должны создать таблицу, содержащую первичный ключ.

Еще один способ сказать это;

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

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

Если кто-то прочитал это далеко. Я надеюсь, что это помогло сделать проверенный ответ более ясным. Я знаю, что некоторые из вас могут чувствовать, что подобные вещи довольно просты и что открытие книги ответило бы на этот вопрос еще до того, как она была опубликована, но правда в том, что не все учатся одинаково.

plasmasnakeneo
источник
И я бы добавил, что обязательно профилируйте ваш запрос, так как он не всегда отправляет то, что вы думаете, должно быть в базу данных.
HLGEM
20

Вы пытаетесь вставить запись со значением в столбце внешнего ключа, которого нет во внешней таблице.

Например: если у вас есть таблицы «Книги» и «Авторы», где «Книги» имеют ограничение внешнего ключа для таблицы «Авторы», и вы пытаетесь вставить запись книги, для которой нет записи об авторе.

Мэтью Смит
источник
16

Вам нужно будет опубликовать свое заявление для получения дополнительных разъяснений. Но...

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

Джастин Нисснер
источник
5

Проблема не в client_id, как я вижу. Похоже, проблема в 4-м столбце sup_item_cat_id

Я бы побежал

sp_helpconstraint sup_item

и обратите внимание на столбец constraint_keys, возвращаемый для внешнего ключа FK_Sup_Item_Sup_Item_Cat, чтобы подтвердить, какой столбец является актуальной проблемой, но я уверен, что это не тот, который вы пытаетесь исправить. Кроме того, «123123» выглядит подозрительно.

Cobusve
источник
5

Я обнаружил, что все поля должны точно соответствовать.

Например, отправка 'cat dog' - это не то же самое, что отправка 'catdog'.

Чтобы устранить эту проблему, я написал сценарий FK-кода из таблицы, в которую я вставлял данные, запомнил «Внешний ключ», который имел ограничения (в моем случае их было 2), и убедился, что значения этих двух полей совпадают. Точно так же, как они были в таблице, которая выдавала ошибку FK Constraint.

Как только я исправил 2 поля, в которых были проблемы, жизнь стала хорошей!

Если вам нужно лучшее объяснение, дайте мне знать.

Джон Вацлавский
источник
Это действительно помогло мне, ха-ха! Не обращая внимания на этот факт, я исправил проблему! Спасибо
Джонатан Браун
4

Я также получил ту же ошибку в моем коде SQL, это решение работает для меня,


Проверьте данные в первичной таблице. Возможно, вы вводите значение столбца, которого нет в столбце первичного ключа.

Чандан Кумар
источник
3

Это означает именно то, что он говорит. Вы пытаетесь вставить значение в столбец с ограничением FK, которое не соответствует никаким значениям в таблице поиска.

Donnie
источник
2

Дважды проверьте поля в отношении, для которого определен внешний ключ. В SQL Server Management Studio могут отсутствовать поля, которые вы хотели выбрать при определении отношения. Это сожгло меня в прошлом.

user1424678
источник
2
  1. запустить sp_helpconstraint
  2. обратите ВНИМАНИЕ на столбец constraint_keys, возвращаемый для внешнего ключа
DotNet
источник
2

Отсутствие данных родительской таблицы вызывает проблему. В вашей проблеме отсутствие данных в "dbo.Sup_Item_Cat" вызывает проблему

Sathish
источник
1

У меня была такая же проблема, когда я использовал миграции кода для создания своей базы данных для приложения MVC 5. В конце концов я обнаружил, что метод seed в моем файле configuration.cs вызывает проблему. Мой начальный метод создавал запись таблицы для таблицы, содержащей внешний ключ, перед созданием записи с соответствующим первичным ключом.

Paulie22
источник
1

Я столкнулся с этой проблемой, когда мои поля значений вставки содержали табуляции и пробелы, которые не были очевидны невооруженным глазом. Я создал свой список значений в Excel, скопировал и вставил его в SQL, и выполнил запросы, чтобы найти несоответствия в моих полях FK.

Запросы на совпадение не обнаружили наличие полей и пробелов в моем поле FK, но INSERT распознал их и продолжал генерировать ошибку.

Я снова протестировал, скопировав содержимое поля FK в одну запись и вставив его в запрос вставки. Когда эта запись также не удалась, я посмотрел ближе на данные и, наконец, обнаружил вкладки / пробелы.

После очистки удаленных вкладок / пробелов моя проблема была решена. Надеюсь, это поможет кому-то!

МНБ
источник