将 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 并重新创建这些关系..
在我的一个 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 并重新创建这些关系..