Оператор INSERT конфликтовал с ограничением FOREIGN KEY, но я вижу данные в первичной таблице - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть две таблицы: tblReportNames & tblOutputData.

tblReportNames has a primary key based on two columns, FactorGrp and FactorCode. 


tblOutputData has a foreign key(factorGrp, factor) 
    references tblReportNames(FactorGrp, FactorCode)

Я пытаюсь загрузить некоторые данные в tblOutputData, но получаю следующее сообщение об ошибке,

Оператор INSERT конфликтуетс ограничением FOREIGN KEY "FK_tblOutputData_tblReportNames".Конфликт произошел в базе данных "myDatabase", таблица "dbo.tblReportNames"

Так что я понимаю, что если я пытаюсь вставить данные в tblOutputData (давайте просто предположим, что он имеет только два столбца factorGrp &factor), и если одно из значений данных входит в factorGrp или factor и не существует в таблице tblReportNames, я получу сообщение об ошибке выше.

Может быть, проще увидеть пример,

   tblReportNames

   FactorGrp           Factor
   Weather             W1
   Weather             W2
   Atmosphere          A2
   Atmosphere          A3

Тогда, если я попытаюсь вставить следующее в tblOutputData

    FactorGrp        FactorCode
    Weather          W2                   this is ok
    Atmosphere       A2                   this is ok
    Weather          W9                   this would throw the error above
    Wea              W1                   this would throw the error above

Так что я не понимаю, что каждое значение в моей реальной жизни, то есть значения, которые я вставляю в tblOutputData (factorGrp, factor) уже существует в tblReportNames.Я поместил данные в Excel, выполнил vlookup и т. Д.

Есть ли какая-либо другая причина, по которой я мог бы увидеть это сообщение об ошибке?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вот два предложения для рассмотрения.

1) Все ли имена столбцов совпадают с учетом регистра в таблицах и определениях внешних ключей?Я заметил, что «FactorGrp» также упоминается как «factorGrp».Различия в регистре имен столбцов могут вызывать проблемы при массовых вставках.

2) Работаете ли вы со столбцами типа varchar, в которых могут быть символы завершающего пробела?Чтобы проверить это, вы можете проверить существующие данные таблицы, используя функцию LEN, чтобы убедиться, что сообщаемая длина соответствует просмотренной длине.Вы также можете проверить вводимые данные?

0 голосов
/ 26 февраля 2019

FK связывает строку в таблице (OutputData) со строкой в ​​другой таблице (ReportNames).Это позволяет многим строкам в OutputData относиться к одной строке в ReportData.

Когда я говорю «одна строка», я имею в виду это.Если бы было разрешено использование Weather / A2, это относилось бы к нескольким строкам в «родительской» таблице (ReportData), а это не то, для чего предназначен FK.

Представьте себе систему заказов с таблицей заказов, по одной строке для каждогозаказать с PK OrderId.Каждый заказ может быть для нескольких продуктов.Каждый продукт для заказа заносится в таблицу OrderLine;этот tanle имеет PK OrderLineId, а также OrderId в качестве FK для таблицы Order.Это позволяет ему приказать, чтобы найти его строки, и для каждой строки, чтобы найти его порядок.

Другой способ выразить это состоит в том, что «родительская» часть FK должна быть PK родительской таблицы и что ПК должен существовать .

...