在azure sql表中设置身份

时间:2012-10-25 13:08:54

标签: sql azure azure-sql-database

我有一个包含标识列的表但我不能删除标识属性。

有没有办法禁用它?或者没有身份属性来制作整个表的副本?

2 个答案:

答案 0 :(得分: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)

希望有所帮助

A

编辑:正如@PhilBolduc所指出的,SqlAzure表需要聚簇索引,而不是主键。我已经相应地修改了上面的术语 - 答案的原则仍然存在。

答案 1 :(得分:1)

您不能删除Identity列而不丢弃它。另外添加一个带有临时名称的新列,更新新列值,然后删除上一列。

ALTER TABLE dbo.tablename ADD newcolumnname INT

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

ALTER TABLE dbo.tablename DROP COLUMN oldcolumnname

应该这样做。除非我误解了你的问题?