您好我希望創建一個基於另一個的新表,並創建主鍵。T-SQL使用主鍵創建表
目前這是我如何做到這一點。表B沒有定義主鍵。但我想在表A中創建它們。有沒有一種方法使用這個選擇top 0語句來做到這一點?或者在我創建tableA後需要做一個ALTER TABLE?
感謝
select TOP 0 *
INTO [tableA]
FROM [tableB]
您好我希望創建一個基於另一個的新表,並創建主鍵。T-SQL使用主鍵創建表
目前這是我如何做到這一點。表B沒有定義主鍵。但我想在表A中創建它們。有沒有一種方法使用這個選擇top 0語句來做到這一點?或者在我創建tableA後需要做一個ALTER TABLE?
感謝
select TOP 0 *
INTO [tableA]
FROM [tableB]
簡短的答案是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);
當然,如果dbo.MyTable有一個IDENTITY列已經存在。 –
如果另一個SELECT列有IDENTITY(例如Col1或Col2),則會引發錯誤。 –
@AaronBertrand表有一個IDENTITY與SELECT列有IDENTITY不同。如果表B沒有PK,那麼它很可能沒有IDENTITY。 – Paparazzi
SELECT INTO
不支持複製任何索引,約束,觸發器甚至計算列和其他表的屬性,除了從IDENTITY
財產(只要你不適用表達式到IDENTITY
列。
所以,你必須添加的約束已創建和填充表之後。
謝謝,虐待在選擇INTO後執行ALTER – eetawil
注:你總是可以只有一個** **單主要在任何給定表鍵 - 你不能有多個主鍵.... –
而不是改變只跳過進入和CREATE TABLE。 – Paparazzi
問題是,做一個創建表我需要指定我所有的列... select INTO是創建這些表的快捷方式,如果我不關心列。我想我需要在創建表後執行ALTER操作。感謝您的反饋 – eetawil