2015-09-28 56 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%') 
相关问题