在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-是的,你说得对,谢谢。我会相应地更新我的答案。