2014-10-01 3 views
0

Trying данные вставки таблицы в другую таблицу,SQL таблица Заявление об ошибках в таблице

Но я получаю следующее сообщение об ошибке:

Msg 2627, Level 14, State 1, Line 4
Violation of PRIMARY KEY constraint 'PK___4__10'. Cannot insert duplicate key in object 'dbo.tbl_Diagnosis_Table'.

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

INSERT INTO tbl_Diagnosis_Table 
    SELECT * 
    FROM tbl_Holding_Diagnosis_Table 

INSERT INTO tbl_Diagnosis_Table(Code, [Description], Comments, Discontinued) 
    (SELECT 
     Code, [Description], Comments, Discontinued 
    FROM 
     tbl_Holding_Diagnosis_Table); 
+0

Это нормально, если вставляемые значения получить новые первичные ключи? И является ли основным ключом AutoNumber? –

+0

Нет, это не нормально, потому что они соединяются с другими таблицами. – sclass

+0

Что такое первичный ключ на 'tbl_Diagnosis_Table'? Есть ли первичный ключ на 'tbl_Holding_Diagnosis_Table'? –

ответ

1

Предполагая, что Code является первичным ключом, это должно исключить повторяющиеся строки из вставки:

INSERT INTO tbl_Diagnosis_Table (Code, [Description], Comments, Discontinued) 
SELECT Code, [Description], Comments, Discontinued 
FROM tbl_Holding_Diagnosis_Table 
WHERE tbl_Holding_Diagnosis_Table.Code NOT IN 
    (SELECT Code FROM tbl_Diagnosis_Table) 

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

Возможно, вы захотите просмотреть MERGE statement, если вы хотите обновить существующие строки и вставить только новые.

+0

Пробовал, сообщение об ошибке: Msg 8152, уровень 16, состояние 14, строка 1 Строковые или двоичные данные будут усечены. Заявление было прекращено. – sclass

+0

Пользователь может также захотеть перезаписать то, что уже находится в 'tbl_Diagnosis_Table', если совпадение« Код »; вы захотите сделать это до копирования в новые строки. –

+0

@AdamV Правда, мой ответ не учитывает это. «Слияние в» кажется более подходящим. – jpw

0

Для того, чтобы отфильтровать записи для вставки, вам нужно WHERE с предложением IN, но сначала вам нужно знать, какие поля образуют первичный ключ.

0

Если вы говорите правильно, то все значения уникальны, он оставляет только один вариант. Убедитесь, что, если в таблице tbl_diagnosis_table есть столбец идентификатора, вы устанавливаете IDENTITY_INSERT в положение ON в этой таблице и предоставляете значения вручную при выборе. Возможно, было возможно, что семя и приращение были сброшены в прошлом. Если вы ошиблись, вы должны использовать предложение where, как это было предложено другими.

0

Я собирался предложить использовать запрос Merge для вставки или обновления, пока не заметил, что две вставки в примерном коде оба делают одну и ту же вставку. Ошибка также говорит, что ошибка указана в строке 4, где находится вторая вставка. Если две вставки не являются двумя примерами проблемного кода, то разрешение может быть таким же простым, как удаление одной из вставок.

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

SET IDENTITY_INSERT tbl_Diagnosis_Table ON -- if it is necessary to have the same primary key 
MERGE tbl_Diagnosis_Table AS target 
    USING (SELECT Code, Description, Comments, Discontinued FROM tbl_Holding_Diagnosis_Table) AS source (Code, Description, Comments, Discontinued) 
    ON (target.Code = source.Code) 
WHEN MATCHED THEN 
    UPDATE SET Description = source.Description, 
    Comments = source.Comments, 
    Discontinued = source.Discontinued 
WHEN NOT MATCHED THEN 
    INSERT (Code, Description, Comments, Discontinued) 
    VALUES (source.Code, source.Description, source.Comments, source.Discontinued) 
END; -- missing semicolons causes errors 
SET IDENTITY_INSERT tbl_Diagnosis_Table OFF 

Выполняйте домашнее задание. Есть несколько очень серьезных причин не использовать Merge.

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