Ошибка: инструкция INSERT конфликтует с ограничением FOREIGN KEY.

Бизнес-пользователь попросил меня изменить раскрывающийся список на текстовое поле для создания записей. Выпадающий список был создан по умолчанию для связи с таблицами в моей базе данных. В соответствии с просьбой я внес изменение и заменил раскрывающийся список элементом @Html.EditorFor. Теперь я получаю это сообщение об ошибке, когда пытаюсь создать записи. Есть ли возможное решение, которое может исправить эту ошибку? Нет никаких синтаксических ошибок, которые мешают мне скомпилировать мой код. Эта ошибка возникает во время выполнения.


person Theo    schedule 25.08.2014    source источник


Ответы (3)


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

Внешний ключ - это то, как вы гарантируете, что таблица получает значения «поиска» только из действительного списка.

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

Если вы начнете вводить недопустимые значения в эту таблицу, это означает, что такие вещи, как inner joins, перестанут работать, и данные начнут пропадать в отчетах.

person Nick.McDermaid    schedule 25.08.2014

Нужно немного больше информации, такой как вставляемые таблицы и внешние ключи на них. Вероятно, введенный текст не соответствует тексту из раскрывающегося списка. Скорее всего, вам придется удалить внешний ключ. Однако, если дизайн заключался в том, что вставлялось числовое значение, а не только текстовое, у пользователей теперь есть текстовая область... где числовое значение (я предполагаю здесь какой-то дизайн, поэтому я попросил таблицы и ключи )? Я бы, вероятно, сделал следующее:

  1. Измените структуру таблицы, чтобы вставляемое значение было основано на символах (если это еще не сделано).
  2. Удалить ключевое ограничение
  3. Обновите существующие записи, чтобы текст искомого значения заменял числовые значения (при условии числового дизайна внешнего ключа.
  4. Отбросьте исходную таблицу поиска.
  5. Измените дизайн, чтобы код использовал отдельный столбец в оставшейся таблице для списка значений.

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

person xQbert    schedule 25.08.2014

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

Чтобы удалить эту ошибку, вы можете удалить ограничение

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

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

ОБНОВЛЕНИЕ

Если вы удалили ограничение внешнего ключа, вам нужно будет вставить любые новые (вам нужно будет проверить, являются ли данные новыми или старыми) данные в таблицу поиска, присвоить им ID и затем вставьте этот new ID в основную таблицу, чтобы создать связь между ними. ПРИМЕЧАНИЕ. В этом случае вы можете сохранить the foreign key constraint.

person Himanshu Tyagi    schedule 25.08.2014
comment
Я сделал это, теперь два поля не связаны друг с другом? - person Theo; 25.08.2014