Бизнес потребител поиска да променя падащия списък на текстово поле за създаване на записи. Падащият списък е това, което е създадено по подразбиране за връзка с таблици в моята база данни. Както беше поискано, направих промяната и замених падащия списък с елемент @Html.EditorFor. Сега получавам това съобщение за грешка, когато се опитвам да създам записи. Има ли възможно решение, което може да коригира тази грешка? Няма синтактични грешки, които да ме спрат да компилирам моя код. Тази грешка възниква по време на изпълнение.
Грешка: Операторът INSERT е в конфликт с ограничението FOREIGN KEY
Отговори (3)
Това означава, че вашият напредничав дизайнер на база данни е поставил ограничение във вашата база данни, за да спре хората да въвеждат невалидни стойности. Вашето приложение позволява на потребителя да въвежда невалидни стойности, но за щастие вашата база данни го спира.
Външният ключ е начинът, по който гарантирате, че дадена таблица получава само своите „търсени“ стойности от валиден списък.
Ако премахнете ограничението, ще рискувате да поставите боклук във вашата база данни, което е голямо усилие да се коригира.
Ако започнете да въвеждате невалидни стойности в тази таблица, това означава, че неща като inner joins
спират да работят и данните започват да липсват в отчетите.
Имате нужда от малко повече информация, като таблици, които се вмъкват, и външните ключове в тях. Вероятно въведеният текст не съвпада с този в падащото меню. Вероятно ще трябва да премахнете външния ключ. Въпреки това, ако дизайнът беше, че се вмъква числова стойност, а не само текстова, потребителите вече имат текстова област... където е числовата стойност (предполагам някакъв дизайн тук, поради което поисках таблици и ключове )? Вероятно бих направил следното:
- Променете структурата на таблицата, така че стойността, която се вмъква, да е базирана на знаци (ако вече не е)
- Премахване на ограничението за ключ
- Актуализирайте съществуващите записи, така че текстът на търсената стойност да замества числовите стойности (приемайки цифров дизайн на външния ключ.
- Пуснете оригиналната справочна таблица.
- Променете дизайна, така че кодът да използва distinct в колоната в останалата таблица за своя списък със стойности.
Алтернативата е, че ще трябва да вмъкнете новата текстова стойност първо в справочната таблица, след това да получите нейната нова ключова стойност, след което да направите оператора за вмъкване. Предполагам, че това може да се справи с тригери и израз преди актуализиране, но въпросът; но освен ако няма причина да ги държите отделно, номерираният по-горе списък изглежда по-прост в дългосрочен план
Преди с падащото меню вие позволявахте на потребителя да избира от предварително зададените стойности, т.е. стойности, които присъстваха във вашата справочна таблица, към която сте поставили ограничение за външен ключ. Но сега като потребител може да въведе всяка стойност (която може да не присъства в чуждата таблица), което води до тази грешка.
За да премахнете тази грешка, можете да премахнете ограничението
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
или проверете стойността (спрямо таблицата с външни ключове), въведена от потребителя, преди да я вмъкнете.
АКТУАЛИЗАЦИЯ
Ако сте премахнали ограничението за външния ключ, тогава ще трябва да вмъкнете всички нови(ще трябва да проверите дали данните са нови или стари) данни в справочната таблица, да им присвоите ID
и след това вмъкнете този new ID
в главната таблица, за да създадете връзката между двете. ЗАБЕЛЕЖКА: Можете да поддържате the foreign key constraint
в този случай.