如何将积分主键添加到使用SELECT INTO创建的表中

时间:2013-01-10 15:19:42

标签: sql sql-server tsql sql-server-2012

我正在使用SQL Server 2012并以下列方式创建表:

SELECT x, y
INTO CampRegistration
FROM tableA

UNION

SELECT x, y
FROM tableB

x和y不是主键。我希望CampRegistration表有一个额外的列,它是一个完整的代理主键,即。类似于IDENTITY

如何通过修改SELECT INTO或之后添加和填充列来完成此操作?

5 个答案:

答案 0 :(得分:7)

其他答案会添加行号,但不要将其作为键,并且在您要添加新注册时也无效。以下是在运行SELECT INTO之后,您可以添加IDENTITY列并将其作为键:

ALTER TABLE dbo.CampRegistration
  ADD RegistrationID INT IDENTITY(1,1);

ALTER TABLE dbo.CampRegistration 
  ADD CONSTRAINT PK_CampRegistration
  PRIMARY KEY (RegistrationID);

答案 1 :(得分:4)

您可以使用IDENTITY function直接添加包含IDENTITY属性的列。

;WITH T
     AS (SELECT x,
                y
         FROM   tableA
         UNION
         SELECT x,
                y
         FROM   tableB)
SELECT IDENTITY(INT, 1, 1) AS Id,
       x,
       y
INTO   CampRegistration
FROM   T 

之后您仍然需要添加PK约束,但是当堆转换为聚簇索引时会添加额外的不必要的排序操作。最有效的方法是CREATE

SELECT TOP (0) IDENTITY(INT, 1, 1) AS Id,
               x,
               y
INTO   CampRegistration
FROM   tableA 

然后在表仍为空时添加聚簇主键。

然后插入表格。 SQL Server意识到IDENTITY将处于聚簇索引顺序,并且不会打扰它们。

答案 2 :(得分:3)

使用窗口功能即时创建列。

SELECT Row_Number() Over (Order By x,y) As ID, x, y
INTO CampRegistration
FROM tableA

答案 3 :(得分:3)

由于你有一个UNION,你需要使用CTE或内联视图。

e.g。

SELECT Row_Number() Over (order by x,y) rn, x,y
INTO CampRegistration
FROM
(
SELECT x, y
FROM tableA
UNION
SELECT x, y
FROM tableB
) as t

答案 4 :(得分:2)

如何使用ROW_NUMBER()

SELECT x, y, ROW_NUMBER()
INTO CampRegistration
....