Оператор 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".

25 ответов

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

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

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

У меня тоже была такая же проблема.

Ее правильное и точное решение:

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

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

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

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

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

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

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

    таблица изменения alter Таблица 1 атрибут столбца Имя атрибута не ноль

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

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

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

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

  1. Либо удалите все значения существующей таблицы.
  2. Добавьте все значения ссылки внешнего ключа в новую таблицу.

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

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

В вашем примере ваши таблицы содержат:

tblDomare с PRIMARY KEY (PersNR):

PersNR     |fNamn     |eNamn      |Erfarenhet
-----------|----------|-----------|----------
6811034679 |'Bengt'   |'Carlberg' |10
7606091347 |'Josefin' |'Backman'  |4
8508284163 |'Johanna' |'Backman'  |1
---------------------------------------------

tblBana:

BanNR
-----
1
2
3
-----

Это утверждение:

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

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

2 решения для решения вашей проблемы: - либо добавьте строки вtblBana с BanNR in (6811034679, 7606091347, 8508284163) - or remove all lines intblDomarethat have no correspondance intblBana` (но ваша таблица будет пустой)

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

Данные, введенные вами в таблицу (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);

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

Смутье прав, и Чед ХеджКок привел пример великого мирянина. Я хотел бы опираться на пример Чада, предлагая способ найти / удалить эти записи. Мы будем использовать Клиента как Родителя, а Заказ - как ребенка. 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 

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

С нашей стороны, это сценарий:

  1. У нас есть в базе данных таблица с записями.
  2. Затем я ввожу внешний ключ, НЕ допускающий значения NULL.
  3. После выполнения обновления я получил эту ошибку.

Как я решил, спросите вы?

РЕШЕНИЕ: Я просто удалил все записи таблицы, затем попытался обновить базу данных, и это было успешно.

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

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

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

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

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

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

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

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

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

У меня такая же проблема. Моя проблема заключалась в том, что значение null: true в столбце (файл миграции):

      AddColumn("dbo.table", "column", c => c.Int(nullable: true));
        

Возможные решения:

  1. Измените значение «false», допускающее значение NULL, на «true». (Не рекомендуется)
  2. Изменить тип собственности с int к int? (Рекомендуемые)

И при необходимости измените это позже после добавления столбца> затем отсутствующие данные поля в предыдущих записях

Если вы изменили существующее свойство с допускающего значение NULL на значение, не допускающее значения NULL:
3) Заполните данные столбца в записях базы данных.

Когда вы изменяете столбец таблицы с NULL на столбец, не допускающий NULL, где этот столбец является внешним ключом, вы должны:

  1. Во-первых, инициализируйте этот столбец значением (потому что это внешний ключ, не допускающий значения NULL).

  2. После этого вы можете изменить столбец таблицы обычным образом.

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

Пожалуйста, попробуйте запрос ниже:

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

);

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


INSERT INTO tblBana (BanNR)
Values (3);


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

or you can use this

SELECT fk_id FROM dbo.tableAExceptSELECT fk_id From dbo.tableB

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

Другие вопросы по тегам