慕的地6264312
如果您想在不添加和填充新列的情况下执行此操作,而无需重新排序列,并且几乎没有停机时间,因为表上没有数据发生变化,让我们使用分区功能做一些魔术(但由于没有使用分区,所以不要需要企业版):删除所有指向此表的外键脚本要创建的表; 重命名所有内容,例如'MyTable2','MyIndex2'等。删除IDENTITY规范。你现在应该有两个“相同的” - 表,一个是完整的,另一个是空的,没有IDENTITY。跑 ALTER TABLE [Original] SWITCH TO [Original2]现在您的原始表将为空,新表将具有数据。您已切换两个表的元数据(即时)。删除原始(现在为空的表),exec sys.sp_rename将各种模式对象重命名为原始名称,然后可以重新创建外键。例如,给定:CREATE TABLE Original( Id INT IDENTITY PRIMARY KEY, Value NVARCHAR(300));CREATE NONCLUSTERED INDEX IX_Original_Value ON Original (Value);INSERT INTO OriginalSELECT 'abcd'UNION ALL SELECT 'defg';您可以执行以下操作:--create new table with no IDENTITYCREATE TABLE Original2( Id INT PRIMARY KEY, Value NVARCHAR(300));CREATE NONCLUSTERED INDEX IX_Original_Value2 ON Original2 (Value);--data before switchSELECT 'Original', *FROM OriginalUNION ALLSELECT 'Original2', *FROM Original2;ALTER TABLE Original SWITCH TO Original2;--data after switchSELECT 'Original', *FROM OriginalUNION ALLSELECT 'Original2', *FROM Original2;--clean upDROP TABLE Original;EXEC sys.sp_rename 'Original2.IX_Original_Value2', 'IX_Original_Value', 'INDEX';EXEC sys.sp_rename 'Original2', 'Original', 'OBJECT';UPDATE OriginalSET Id = Id + 1;SELECT *FROM Original;