0

Я выполняю инструкцию INSERT INTO SELECT в SQL Server. Дело в том, что есть два основных ключа из двух разных таблиц, без каких-либо общих черт, которые являются и внешними ключами третьей таблицы, образуя составной первичный ключ в этой последней таблице. Обычно это может быть достигнуто с помощью перекрестного соединения - например,INSERT INTO SELECT CROSS JOIN Composite Primary Key

Table1.ID(PK) 
Table2.Code(PK) 

-- Composite PK for Table3 
Table3.ID(FK) 
Table3.Code(FK) 

INSERT INTO Table3 
SELECT ID, Code 
FROM Table1 
CROSS JOIN Table2 
WHERE Some_conditions... 

Я получаю «Не удается вставить повторяющуюся ключевую строку» ошибка. Это не позволит Table2.Code повторяться в Таблице 3, поскольку это уникальный идентификатор, хотя первичный ключ Table3 является Table1.ID в сочетании с Table2.Code. Следовательно, следующие пары должны быть распознаны как разные значения PK в таблице 3, например: {1024, PSV} и {1027, PSV}.

Есть ли способ исправить это, или я неправильно создал эту базу данных? Я рассмотрел создание третьего уникального идентификатора для Table3, но в этом сценарии это очень нецелесообразно.

+0

Казалось бы, у вас уже есть данные в таблице, которые конфликтуют с новыми строками. –

+0

Стол пуст. –

+2

Можете ли вы разместить фактические определения таблиц и несколько строк первых двух таблиц? До сих пор не так много подробностей, и сложно сказать, что происходит. –

ответ

2

Это поможет вам локализовать проблему:

SELECT ID, Code 
FROM Table1 
CROSS JOIN Table2 
WHERE Some_conditions... 
GROUP BY ID, Code 
HAVING COUNT(*) > 1 
+0

^К сожалению, строки не были возвращены, что означает, что дубликатов нет (как я подозревал). –

1

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

Например, таблица 2 может иметь две или более строки ID 1024 и код «PSV».

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

INSERT INTO Table3 
SELECT DISTINCT ID, Code 
FROM Table1 
CROSS JOIN Table2 
WHERE Some_conditions... 
+0

^Я пробовал это безрезультатно - нет дубликатов обеих записей. Идентификаторы и коды повторяются, но не всегда. 1024 PSV, 1027 PSV и 1024 RFT должны представлять 3 разных ПК. –

0

SQL Server был создан уникальным, некластеризованный индекс для Table3, который предотвращающего INSERT INTO заявления от исполнения. Я отключил его с помощью обозревателя объектов SQL Server Management Studio, и это позволило мне ввести строки.

Смежные вопросы