Грешка: Операторът 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. Променете дизайна, така че кодът да използва distinct в колоната в останалата таблица за своя списък със стойности.

Алтернативата е, че ще трябва да вмъкнете новата текстова стойност първо в справочната таблица, след това да получите нейната нова ключова стойност, след което да направите оператора за вмъкване. Предполагам, че това може да се справи с тригери и израз преди актуализиране, но въпросът; но освен ако няма причина да ги държите отделно, номерираният по-горе списък изглежда по-прост в дългосрочен план

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