您好我想基于另一个创建一个新表并创建主键。
目前这就是我的做法。表B没有定义主键。但是我想在表A中创建它们。有没有办法使用这个select top 0语句来做到这一点?或者在创建tableA之后是否需要执行ALTER TABLE?
由于
select TOP 0 *
INTO [tableA]
FROM [tableB]
答案 0 :(得分:5)
SELECT INTO
属性之外, IDENTITY
不支持复制任何索引,约束,触发器甚至计算列和其他表属性(只要不应用表达式IDENTITY
列。
因此,您必须在创建并填充表格后添加约束。
答案 1 :(得分:1)
简短的回答是否定的。 SELECT INTO将始终创建一个HEAP表,并根据Books Online:
源表中定义的索引,约束和触发器不是 转移到新表,也不能在中指定 SELECT ... INTO语句。如果需要这些对象,则必须 在执行SELECT ... INTO语句后创建它们。
因此,在执行SELECT INTO之后,您需要执行ALTER TABLE或CREATE UNIQUE INDEX以添加主键。
此外,如果dbo.TableB还没有IDENTITY列(或者如果它确实存在并且您希望由于某种原因将其遗漏),则需要创建一个人工主键列(而不是使用现有列)在dbo.TableB中作为新的主键),您可以使用IDENTITY函数创建候选键列。但是你仍然必须在事实之后将约束添加到TableA以使其成为主键,因为只有IDENTITY函数/属性本身并不能这样做。
-- This statement will create a HEAP table
SELECT Col1, Col2, IDENTITY(INT,1,1) Col3
INTO dbo.MyTable
FROM dbo.AnotherTable;
-- This statement will create a clustered PK
ALTER TABLE dbo.MyTable
ADD CONSTRAINT PK_MyTable_Col3 PRIMARY KEY (Col3);