将 IDENTITY PK 列添加到现有 SQL 服务器 table 是否安全?

Is it safe to add IDENTITY PK Column to existing SQL SERVER table?

在我的一个 SQL SERVER 数据库中重建所有 table 到一个新数据库后,我未能将 'ID' 列设置为 IDENTITY 和 PRIMARY KEY许多 table。大部分都有数据。

我发现了这个 T-SQL,并且已经为几个 table 成功实施了它。 new/replaced ID 列包含与上一列相同的值(仅仅是因为它们来自我从中导入的 table 中的自动递增列),并且我现有的存储过程仍然有效。

Alter Table ExistingTable
Add NewID Int Identity(1, 1)
Go

Alter Table ExistingTable Drop Column ID
Go

Exec sp_rename 'ExistingTable.NewID', 'ID', 'Column'

--Then open the table in Design View, and set the new/replaced column as the PRIMARY KEY
--I understand that I could set the PK when I create the new IDENTITY column

new/replaced ID 列现在是 table 中的最后一列,到目前为止,我还 运行 没有遇到 ASP 的问题。Net/C#调用存储过程的数据访问对象。

如前所述,这些 table 中的每一个都没有设置 PRIMARY KEY(也没有 FOREIGN KEY)。考虑到这一点,我是否应该采取任何其他步骤来确保数据库的完整性?

I 运行 across this SO post,这表明我应该 运行 'ALTER TABLE REBUILD' 语句,但是因为没有 PK 已经设置,我真的需要这样做吗?

最终,我只是想确保我不会制造直到游戏后期才会出现的问题,并确保我正在实施的方法合理、合乎逻辑并确保数据完整性。

我想 DROP/RECREATE 带有适当 PK/IDENTITY 列的 table 可能是更好的选择,我可以写一些 T-SQL 来转储将现有数据导入 TEMP table,然后 drop/recreate,并使用来自 TEMP table 的数据重新填充新的 table。我特意避免了这个选项,因为它看起来更具侵略性,而且我不完全理解它对依赖于这些 tables.

的 Stored Procedures/Functions 等意味着什么

这是我执行过此操作的 table 之一的示例。您可以看到 NewID 值与原始 ID 相同。enter image description here

试一试;它是从我们几年前在类似情况下使用的脚本中翻出来的,不记得它所针对的是哪个版本的 SQLS。如果它适用于您的场景,您可以将其适应您的 tables ..


SELECT MAX(Id)+1 FROM causeCodes -- run and use value below

CREATE TABLE [dbo].[CauseCodesW]( [ID] [int] NOT NULL IDENTITY(put_maxplusone_here,1), [Code] [varchar](50) NOT NULL, [Description] [varchar](500) NULL, [IsActive] [bit] NOT NULL )


ALTER TABLE CauseCodes SWITCH TO CauseCodesW;

DROP TABLE CauseCodes;

EXEC sp_rename 'CauseCodesW','CauseCodes';

ALTER TABLE CauseCodes ADD CONSTRAINT PK_CauseCodes_Id PRIMARY KEY CLUSTERED (Id);

SELECT * FROM CauseCodes;

您现在可以找到与此 table 有 FK 的任何 table 并重新创建这些关系..