Оператор ALTER TABLE противоречил ограничениям FOREIGN KEY - программирование
Подтвердить что ты не робот

Оператор ALTER TABLE противоречил ограничениям FOREIGN KEY

У меня возникла проблема при попытке добавить внешний ключ в таблицу tblDomare; что я делаю неправильно здесь?

CREATE TABLE tblDomare
(PersNR VARCHAR (15) NOT NULL,
fNamn VARCHAR (15) NOT NULL,
eNamn VARCHAR (20) NOT NULL,
Erfarenhet VARCHAR (5),
PRIMARY KEY (PersNR));

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (7606091347,'Josefin','Backman',4);

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (8508284163,'Johanna','Backman',1);

CREATE TABLE tblBana
(BanNR VARCHAR (15) NOT NULL,
PRIMARY KEY (BanNR));

INSERT INTO tblBana (BanNR)
Values (1);

INSERT INTO tblBana (BanNR)
Values (2);

INSERT INTO tblBana (BanNR)
Values (3);

ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);

Сообщение об ошибке:

Оператор ALTER TABLE противоречил ограничениям FOREIGN KEY "FK_tblDomare_PersN__5F7E2DAC". Конфликт произошел в базе данных "almu0004", таблице "dbo.tblBana", в столбце "BanNR".

4b9b3361

Ответ 1

Это произошло потому, что вы пытались создать внешний ключ от tblDomare.PersNR до tblBana.BanNR, но /, а значения в tblDomare.PersNR не совпадали ни с одним из значений в tblBana.BanNR. Вы не можете создать связь, которая нарушает ссылочную целостность.

Ответ 2

Этот запрос был очень полезен для меня. Он показывает все значения, которые не имеют совпадений

select FK_column from FK_table
WHERE FK_column NOT IN
(SELECT PK_column from PK_table)

Ответ 3

Можно создать внешний ключ, используя ALTER TABLE tablename WITH NOCHECK..., который позволит использовать данные, нарушающие внешний ключ.

"ALTER TABLE tablename WITH NOCHECK..." для добавления FK - это решение сработало для меня.

Ответ 4

Попробуйте это решение:

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

Ответ 5

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

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

    alter table Таблица 1 добавить внешние ключи (имя столбца) Таблица 2 (Название столбца)

    alter table Таблица 1 alter column Атрибут столбца Имя не пусто

Ответ 6

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

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

Например, Если столбец "Первичная таблица" имеет значения 1, 2, 3 и в столбце "Внешние ключи", вставленные значения различаются, тогда запрос не будет выполняться, поскольку он ожидает, что значения будут находиться в пределах от 1 до 3.

Ответ 7

Очистите данные от своих таблиц, а затем сделайте между ними связь.

Ответ 8

Попробуйте DELETE текущие данные из tblDomare.PersNR. Поскольку значения в tblDomare.PersNR не совпадают ни с одним из значений в tblBana.BanNR.

Ответ 9

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

Ответ 10

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

например, вы ввели таблицу tbldomar этих данных

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);

и вы назначили таблицу foreign key для принятия только 1,2,3.

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

ALTER TABLE  tblDomare with nocheck
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);

Ответ 11

Смутье прав, и Чед ХеджКок привел отличный пример для неспециалистов. Я хотел бы опираться на пример Чада, предлагая способ найти/удалить эти записи. Мы будем использовать Клиента как Родителя, а Заказ - как ребенка. CustomerId - это общее поле.

select * from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

если вы читаете эту ветку... вы получите результаты. Это дети-сироты. выберите * из заказа. Дочернее соединение слева с Родителем клиента на Child.CustomerId = Parent.CustomerId, где Parent.CustomerId равно нулю. Обратите внимание на количество строк в правом нижнем углу.

Идите и убедитесь, кому вы хотите удалить эти строки!

begin tran 
delete Order
from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

Запустите первый бит. Проверьте количество строк = то, что вы ожидали

совершить транс

commit tran 

Быть осторожен. Кто-то небрежное программирование втянул вас в этот беспорядок Убедитесь, что вы понимаете, почему, прежде чем удалить сирот. Может быть, родитель должен быть восстановлен.

Ответ 12

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

Поэтому мне нужно обрезать обе таблицы, и теперь это работает!

Ответ 13

Вы должны увидеть, есть ли в ваших таблицах какие-либо данные по строкам. Если "да", то вы должны усечь таблицу (таблицы), иначе вы можете сделать так, чтобы они имели одинаковое количество данных на tblDomare.PersNR tblBana.BanNR и vise-verse.

Ответ 14

В моем сценарии, используя EF, при попытке создать этот новый внешний ключ на существующих данных я ошибочно пытался заполнить данные (сделать ссылки) ПОСЛЕ создания внешнего ключа.

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

Ответ 15

Я столкнулся с некоторой проблемой в моем проекте.

enter image description here

В дочерней таблице нет ни одного идентификатора записи, равного 1 и 11

enter image description here

Я вставил таблицу DEAL_ITEM_THIRD_PARTY_PO, Id которой равен 1 и 11, после чего я могу создать FK

Ответ 16

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