将现有的SQL SERVER表添加IDENTITY PK列是否安全?

10 浏览
0 Comments

将现有的SQL SERVER表添加IDENTITY PK列是否安全?

在重新构建我SQL SERVER数据库中的所有表后,我没有为许多表设置'ID'列为IDENTITY和PRIMARY KEY。其中大部分表都有数据。

我发现了这个T-SQL,并且已经成功地在一些表中实施了它。新/替换的ID列包含了从以前的列中获取的相同值(因为它们是从导入的表中的自增列获取的),而且我的现有存储过程仍然有效。

Alter Table ExistingTable
Add NewID Int Identity(1, 1)
Go
Alter Table ExistingTable Drop Column ID
Go
Exec sp_rename 'ExistingTable.NewID', 'ID', 'Column'
--然后在设计视图中打开表,并将新/替换的列设置为PRIMARY KEY。
--我知道在创建新的IDENTITY列时可以设置PK

新/替换的ID列现在是表中的最后一列,到目前为止,我没有遇到调用存储过程的ASP.Net/C#数据访问对象的问题。

如上所述,这些表中没有设置PRIMARY KEY(也没有设置FOREIGN KEY)。在这种情况下,我是否需要采取其他措施来确保数据库的完整性?

我遇到了这个 SO帖子,建议我运行'ALTER TABLE REBUILD'语句,但是由于没有设置PK,我真的需要这样做吗?

最重要的是,我只是想确保我不会创建一些直到后来才出现问题的问题,并确保我正在实施的方法是可靠、合理和确保数据完整性的。

我想,最好的选择可能是使用正确的PK/IDENTITY列删除/重新创建表,然后我可以编写一些T-SQL将现有数据转储到临时表中,然后删除/重新创建,并使用来自临时表的数据重新填充新表。我特意避免了这个选项,因为它似乎更具侵略性,而且我并不完全理解对这些依赖于这些表的存储过程/函数等意味着什么。

这是我已经对其中一个表执行的操作的示例。您可以看到NewID的值与原始ID相同。enter image description here

0
0 Comments

添加IDENTITY PK列到现有的SQL SERVER表是否安全?

问题出现的原因:用户想要在现有的SQL SERVER表中添加一个IDENTITY PK列,但担心这样做是否安全。

解决方法:用户可以尝试以下步骤来添加IDENTITY PK列。首先,运行以下SQL语句以获取当前表中ID的最大值加1的结果:

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

然后,创建一个新的表CauseCodesW,定义ID列为IDENTITY(put_maxplusone_here,1):

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切换到新表CauseCodesW:

ALTER TABLE CauseCodes SWITCH TO CauseCodesW;

然后,删除旧表CauseCodes:

DROP TABLE CauseCodes;

重命名新表CauseCodesW为CauseCodes:

EXEC sp_rename 'CauseCodesW','CauseCodes';

最后,使用ALTER TABLE语句将ID列设置为主键:

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

通过SELECT语句可以验证表的变化:

SELECT * FROM CauseCodes;

完成上述步骤后,可以重新创建与该表有外键关系的其他表的关系。

在SSMS中,还可以使用"script as .. create .. to new window"来将表生成脚本。此外,可以使用数据库图形化窗口进行拖放操作来创建关系。

另外,用户还可以使用DBCC CHECKIDENT命令来代替SELECT MAX命令。

0