2012-10-25 29 views
2

我有一個包含標識列但不能刪除標識屬性的表。在azure sql表中設置標識

有沒有辦法禁用它?或者一種方法來製作沒有身份屬性的整個表的副本?

回答

5

請注意,如果列由聚簇索引引用,則可能無法刪除列,並且不能刪除表中的所有聚簇索引,因爲SqlAzure表必須始終具有聚簇索引。

這意味着你可能通過以下跳火圈(至少你最後的聚集索引,這很可能是你的主鍵):

  • 重命名您的聚集索引
  • 創建一個臨時版本表(用新的聚集索引)
  • 從當前表中的數據複製
  • 刪除當前表
  • 臨時表重命名爲當前的名稱

這大致是這樣的:

-- Rename clustered index 
EXECUTE sp_rename N'PK_My_Current_PK', N'PK_My_Current_PK_OLD', 'OBJECT' 

-- If you have any FK constraints on the table, then drop them 
ALTER TABLE dbo.MyTable DROP CONSTRAINT FK_My_Foreign_Key 

-- Create the new version of your table - because this is SQLAzure it must have a clustered index 
CREATE TABLE dbo.tmp_MyTable (
    MyID int NOT NULL, 
    CONSTRAINT PK_My_Current_PK PRIMARY KEY CLUSTERED (MyID) 
) 

-- Copy the data into the temp table from the old table 
INSERT INTO dbo.tmp_MyTable (MyID) 
    SELECT MyID FROM dbo.MyTable 

-- Drop the old table 
DROP TABLE dbo.MyTable 

-- Rename the new table 
EXECUTE sp_rename N'tmp_MyTable', N'MyTable', 'OBJECT' 

-- Recreate any foreign key constraints 
ALTER TABLE dbo.MyTable WITH CHECK ADD FK_My_Foreign_Key FOREIGN KEY (MyID) 
    REFERENCES dbo.MyForeignTable (MyID) 

希望幫助

一個

編輯:作爲@PhilBolduc指出SqlAzure表需要一個聚集索引,不是主鍵。我已經修改了上面的術語 - 答案的原則依然存在。

+0

謝謝。那正是我的問題。太糟糕了,它不能做更容易的想法。非常感謝 – Michael

+0

SqlAzure中的PK約束是其他版本不具備的一個非常令人沮喪的限制(或者差異 - 我猜這是一個更合適的詞)。很高興答案指出了它。 – alergy

+1

SQL Azure中的表不需要PK。他們需要一個聚集索引。見http://msdn.microsoft.com/en-us/library/windowsazure/ee336245.aspx#cir –

1

不幸的是,您不能刪除標識列而不刪除它。新增一個帶有臨時名稱的新列,更新新的列值,然後刪除前一列。

ALTER TABLE dbo.tablename ADD newcolumnname INT 

UPDATE dbo.tablename SET newcolumnname = oldcolumnname FROM dbo.tablename 

ALTER TABLE dbo.tablename DROP COLUMN oldcolumnname 

應該這樣做。除非我誤解了你的問題?

+0

對不起。我應該提到我有過敏問題,因爲列上的主鍵,我無法刪除它。但是,謝謝! – Michael