3

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

SELECT x, y
INTO CampRegistration
FROM tableA

UNION

SELECT x, y
FROM tableB

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

我怎样才能做到这一点,无论是通过修改SELECT INTO或添加并填充列之后?

4

5 回答 5

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);
于 2013-01-10T15:32:48.697 回答
4

您可以使用该IDENTITY函数直接添加具有该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将是聚集索引顺序,并且不会费心对它们进行排序。

于 2013-01-10T16:43:32.360 回答
3

Use window function to create the column on the fly.

SELECT Row_Number() Over (Order By x,y) As ID, x, y
INTO CampRegistration
FROM tableA
于 2013-01-10T15:23:03.880 回答
3

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

例如

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
于 2013-01-10T15:27:52.387 回答
2

如何使用ROW_NUMBER()

SELECT x, y, ROW_NUMBER()
INTO CampRegistration
....
于 2013-01-10T15:22:02.740 回答