我正在使用SQL Server 2012并以下列方式创建表:
SELECT x, y
INTO CampRegistration
FROM tableA
UNION
SELECT x, y
FROM tableB
x和y不是主键。我希望CampRegistration
表有一个额外的列,它是一个完整的代理主键,即。类似于IDENTITY
。
如何通过修改SELECT INTO
或之后添加和填充列来完成此操作?
答案 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)