在将一个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'
--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
新的/替换的ID列现在是表中的最后一列,到目前为止,我还没有遇到ASP的问题。. net/c#中调用存储过程的数据访问对象。
如前所述,这些表都没有设置PRIMARY KEY(也没有FOREIGN KEY)。考虑到这一点,我应该采取哪些额外的步骤来确保数据库的完整性?我偶然看到这篇文章,这表明我应该运行'ALTER TABLE REBUILD'语句,但由于没有PK已经设置,我真的需要这样做吗?
最终,我只是想确保我不会制造直到游戏后期才会出现的问题,并确保我执行的方法是合理的,合乎逻辑的,并确保数据完整性。
我想它可能是一个更好的选择,删除/重建表与适当的PK/IDENTITY列,我可以写一些T-SQL转储现有的数据到一个TEMP表,然后删除/重建,并重新填充新表的数据从TEMP表。我特别避免了这个选项,因为它看起来更激进,而且我不完全理解它对依赖于这些表的存储过程/函数等意味着什么。
下面是我执行此操作的其中一个表的示例。您可以看到NewID值与原始ID相同。输入图片描述
试一试;它是从我们几年前在类似情况下使用的脚本中翻出来的,不记得它用于哪个版本的sql…如果它适用于您的场景,您可以将其调整到您的表..
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;
你现在可以找到任何有FKs到这个表的表,并重新创建这些关系。