我有一个包含标识列的表,但我无法删除标识属性。
有没有办法禁用它?或者一种在没有身份属性的情况下复制整个表的方法?
请注意,如果列被聚集索引引用,您可能无法删除该列,并且您不能删除表的所有聚集索引,因为 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 表需要聚集索引,而不是主键。我已经相应地修改了上面的术语 - 答案的原则仍然存在。
不幸的是,您无法删除身份列而不删除它。或者添加一个具有临时名称的新列,更新新列值,然后删除前一列。
ALTER TABLE dbo.tablename ADD newcolumnname INT
UPDATE dbo.tablename SET newcolumnname = oldcolumnname FROM dbo.tablename
ALTER TABLE dbo.tablename DROP COLUMN oldcolumnname
应该这样做。除非我误解了你的问题?