在azure sql表中设置标识

在azure sql表中设置标识,sql,azure,azure-sql-database,Sql,Azure,Azure Sql Database,我有一个包含标识列的表,但我无法删除标识属性 有没有办法禁用它?或者是一种在没有标识属性的情况下复制整个表的方法?很遗憾,如果不删除标识列,则无法将其删除。也可以使用临时名称添加新列,更新新列值,然后删除前一列 ALTER TABLE dbo.tablename ADD newcolumnname INT UPDATE dbo.tablename SET newcolumnname = oldcolumnname FROM dbo.tablename ALTER TABLE dbo.tabl

我有一个包含标识列的表,但我无法删除标识属性


有没有办法禁用它?或者是一种在没有标识属性的情况下复制整个表的方法?

很遗憾,如果不删除标识列,则无法将其删除。也可以使用临时名称添加新列,更新新列值,然后删除前一列

ALTER TABLE dbo.tablename ADD newcolumnname INT

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

ALTER TABLE dbo.tablename DROP COLUMN oldcolumnname

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

请注意,如果列被聚集索引引用,您可能无法删除该列,并且您无法删除表的所有聚集索引,因为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表需要聚集索引,而不是主键。我已相应地修改了上述术语-答案的原则仍然保留。

对不起。我应该提到我遇到了alergy提到的问题,由于列上的主键,我无法删除它。但是谢谢!谢谢那正是我的问题。太糟糕了,想起来不容易。非常感谢SqlAzure中的PK约束是一个非常令人沮丧的限制(或差异——我想这是一个更合适的词),其他版本没有。很高兴答案指出了这一点。SQLAzure中的表不需要PK。它们确实需要一个聚集索引。看@PhilBolduc-是的,你说得对,谢谢。我会相应地更新我的答案。