2015-09-28 3 views
0

Мне нужно дублировать некоторые строки в таблице, но первичный ключ должен быть уникальным. Когда я пытаюсь сделать это таким образом, я получаю «Нарушение ограничения PRIMARY KEY»SQL - нужно дублировать строки, но с уникальным первичным ключом

INSERT INTO Company.Customer 
SELECT CustomerId, FirstName, LastName 
FROM Company.Customer 
WHERE LastName LIKE '%JONES%'; 

CUSTOMERID в этом примере является первичным ключом. Поэтому значения в FirstName и LastName должны оставаться неизменными, но CustomerId необходимо изменить

Спасибо!

+1

Является полем 'CustomerId' поле IDENTITY? Также это MySQL или SQL Server? – dotnetom

+0

Есть веская причина, почему первичный ключ уникален! –

+0

Это SQL Server. В свойствах он говорит «Первичный ключ»: «Истина», «Разрешить Nulls: False», «Вычисляется»: False, Identity: False, Identity Seed: 0, Increment Identity: 0 – user5171795

ответ

4

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

-- Retrieve maximum value of CustomerId 
DECLARE @maxid int = 0 
SELECT @maxid = MAX(CustomerId) FROM Company.Customer 

-- When inserting data for column CustomerId add maximum id value and row number 
-- This should ensure that the key values do not clash 
INSERT INTO Company.Customer (CustomerId, FirstName, LastName) 
SELECT ROW_NUMBER() OVER (ORDER BY CustomerId ASC) + @maxid, FirstName, LastName 
FROM Company.Customer  
WHERE LastName LIKE '%JONES%'; 

Однако, если у вас нет причин не делать этого, я предлагаю использовать столбец IDENTITY - Это будет делать вещи проще в обращении.

+0

Это в Microsoft SQL. Когда я это делаю, он говорит: «Имя столбца или количество заданных значений не соответствуют определению таблицы». – user5171795

+0

Является ли ваша таблица «Company.Customer» и имеет ли она столбцы «FirstName» и «LastName»? – dotnetom

+0

Я изменил этикетки, но это по сути то же самое. В свойствах он говорит «Первичный ключ»: «Истина», «Разрешить Nulls: False», «Вычисляется»: False, Identity: False, Identity Seed: 0, Increment Identity: 0 – user5171795

2

Оставьте первичный ключ «CustomerId» из выбранной части вашего запроса ... Он должен быть сгенерирован автоматически для вставленных строк.

INSERT INTO Customer (FirstName, LastName) 
(SELECT FirstName, LastName 
FROM Customer 
WHERE LastName LIKE '%JONES%') 
Смежные вопросы