2015-09-28 30 views
0

我需要複製表中的某些行,但主鍵需要唯一。當我嘗試做這種方式,我得到一個「PRIMARY KEY約束衝突」SQL - 需要複製行但具有唯一的主鍵

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

客戶編號在本例中的主鍵。所以FirstName和LastName中的值需要保持不變,但CustomerId需要更改

謝謝!

+1

字段'CustomerId'是IDENTITY字段嗎?也是它的MySQL或SQL Server? – dotnetom

+0

主鍵是獨一無二的! –

+0

它是SQL Server。在屬性中,它表示主鍵:真,允許空值:假,計算:假,身份:假,身份種子:0,身份遞增: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

我已經改變了標籤,但它本質上是一樣的。在屬性中,它表示主鍵:真,允許空值:假,計算:假,身份:假,身份種子:0,身份增量:0 – user5171795

2

將主鍵「CustomerId」留在查詢的選定部分之外...應該在插入的行上爲您自動生成。

INSERT INTO Customer (FirstName, LastName) 
(SELECT FirstName, LastName 
FROM Customer 
WHERE LastName LIKE '%JONES%') 
相關問題