2013-08-29 72 views
1

您好我希望創建一個基於另一個的新表,並創建主鍵。T-SQL使用主鍵創建表

目前這是我如何做到這一點。表B沒有定義主鍵。但我想在表A中創建它們。有沒有一種方法使用這個選擇top 0語句來做到這一點?或者在我創建tableA後需要做一個ALTER TABLE?

感謝

select TOP 0 * 
INTO [tableA] 
FROM [tableB] 
+0

注:你總是可以只有一個** **單主要在任何給定表鍵 - 你不能有多個主鍵.... –

+0

而不是改變只跳過進入和CREATE TABLE。 – Paparazzi

+0

問題是,做一個創建表我需要指定我所有的列... select INTO是創建這些表的快捷方式,如果我不關心列。我想我需要在創建表後執行ALTER操作。感謝您的反饋 – eetawil

回答

1

簡短的答案是NO。SELECT INTO永遠CREA TE堆表,並且根據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); 
+1

當然,如果dbo.MyTable有一個IDENTITY列已經存在。 –

+0

如果另一個SELECT列有IDENTITY(例如Col1或Col2),則會引發錯誤。 –

+1

@AaronBertrand表有一個IDENTITY與SELECT列有IDENTITY不同。如果表B沒有PK,那麼它很可能沒有IDENTITY。 – Paparazzi

5

SELECT INTO不支持複製任何索引,約束,觸發器甚至計算列和其他表的屬性,除了從IDENTITY財產(只要你不適用表達式到IDENTITY列。

所以,你必須添加的約束已創建和填充表之後。

+0

謝謝,虐待在選擇INTO後執行ALTER – eetawil