我正在使用 SQL Server 2012 并通过以下方式创建表:
SELECT x, y
INTO CampRegistration
FROM tableA
UNION
SELECT x, y
FROM tableB
x 和 y 不是主键。我希望CampRegistration
表有一个额外的列,它是一个完整的代理主键,即。类似的东西IDENTITY
。
我怎样才能做到这一点,无论是通过修改SELECT INTO
或添加并填充列之后?
我正在使用 SQL Server 2012 并通过以下方式创建表:
SELECT x, y
INTO CampRegistration
FROM tableA
UNION
SELECT x, y
FROM tableB
x 和 y 不是主键。我希望CampRegistration
表有一个额外的列,它是一个完整的代理主键,即。类似的东西IDENTITY
。
我怎样才能做到这一点,无论是通过修改SELECT INTO
或添加并填充列之后?
其他答案会添加行号,但不要将其设为键,并且在您想添加新注册时也无济于事。以下是在您运行 SELECT INTO 之后,您可以添加一个 IDENTITY 列并使其成为键的方法:
ALTER TABLE dbo.CampRegistration
ADD RegistrationID INT IDENTITY(1,1);
ALTER TABLE dbo.CampRegistration
ADD CONSTRAINT PK_CampRegistration
PRIMARY KEY (RegistrationID);
您可以使用该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
将是聚集索引顺序,并且不会费心对它们进行排序。
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
由于您有一个 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