2011-09-28 51 views
0

不知道最好的方式做到这一点,或者甚至有一个最好的答案,但现在的问题是:我需要改变一个表中的唯一ID列

我有一个SQL Server 2000数据库包含在至少13桌。某些表格具有唯一的ID(SysName),因此只能有一个唯一的SysName值(alpha001, alpha002, alpha003等)。

到目前为止我还在吗?现在

,客户端想要能够在数据库中(alpha001,alpha001,alpha001,alpha002,alpha002,alpha003,alpha003,alpha003,alpha003,alpha003等)插入多个sysnames值。最重要的是,如果您在一个表中更改了sysname(alpha001到beta001)的值,那么其他一些表中的值也会更新(我现在有一个关于此时被称为什么的脑屁) 。

我还想添加一个新列(SysNameID)并将其设置为自动增量。什么是最好的方式来做到这一点,以便它将通过数据库,并添加SysNameID值(1,2,3,4,5,6 ...),这样我就不必重建表格了?

我想我需要为所有受影响的表添加一个SysNameID列,并在表之间设置(脑屁词)以保留关联(用于数据完整性目的)。

如果这是要求不明确,请留下评论,我会尽我所能来回答它。你们中有些人非常聪明,所以你可能不得不为我贬低它。 :)

+1

级联更新就是你的大脑屁约为 –

+0

@拉吉,更是!谢谢! – HPWD

回答

3

基本流程:

确保您有最新的备份,不要试图通过这样做PROD上没有首先对发展进行测试。这是一个非常广泛的变化,您可能需要将prod恢复到新的dev实例,因为这样做会耗时且棘手,并且其他开发会受到干扰。

您标识列添加到一个名为SysNameID父表(见@marc_s'章节答案)

您一个int的列到每个子表也被称为SysNameId。它不是自动增量列,必须允许空值。

您通过使用当前的sysname列来查找与该sysname相关的id来更新此列。

一旦所有的列都被填充,您将列设置为不允许空值并为父表创建外键。代理键不应该改变,所以你不需要级联更新。

最后,从子表中删除sysname列,并调整使用它的所有代码以加入父表并查找它。或者,您可以重命名每个子表并创建一个将子表连接到父级的视图,并从那里获取sysname列。这应该确保现有的代码不会中断。

有没有简单的方法来满足您的要求。您正在改变数据库如何工作的基本原理。它有可能影响几乎每个针对子表的查询。它可能会影响报告(可能按照现在不再唯一的sysname排序)。这是一个重大的改变,要做到这一点可能需要几个月的时间。

推荐阅读: http://www.amazon.com/Refactoring-Databases-Evolutionary-Database-Design/dp/0321293533/ref=sr_1_1?ie=UTF8&s=books&qid=1268158669&sr=8-1

+0

@glgem - 你一定明白我在这里工作。谢谢你分解它。我没有考虑过使用视图,所以我可以研究一下。我正确地标记你的答案,但我会添加一个注释来查看marc_s以及解决方案。 – HPWD

+0

请参阅下面的SQL语句的marc_s文章。 – HPWD

+1

获取该书的副本并阅读它,它将帮助您设计这个过程很多。 – HLGEM

3

我不完全明白你的问题/挑战是与当前sysname列什么....

但对于第二部分:是的,你可以很容易地添加一个自动增量列到表( s),不,你不需要做任何事情(比如“重建表格” - 不管那个应该是什么.....) - SQL Server会用你自动增加的值填充现有的行$

ALTER TABLE dbo.YourTableNameHere 
    ADD SysNameID INT IDENTITY(1,1) NOT NULL 

我通常建议让该IDENTITY柱您的主要(和群集)为表键,或者如果这是不可能的,一个t个最低把唯一约束列,以防止插入重复的值:

ALTER TABLE dbo.YourTableNameHere 
    ADD CONSTRAINT UC_SysNameID UNIQUE(SysNameID) 
+0

@ marc-s在过去,当我试图向现有的表添加标识时,Studio让Studio告诉我需要重建表。如果我再次收到消息,我会在这里发布以供参考。 – HPWD

+0

@dlackey:好的 - 嗯......你在视觉设计师中添加了那些列吗?我倾向于完全使用T-SQL脚本 - 从来没有使用过这种方法的任何此类消息...... –

+0

@ marc -s不,我正在使用Microsoft SQL Server Manager Studio 2008连接到SQL2000数据库。我会找到表格,右键单击它,单击设计,然后添加所需的列。 – HPWD

相关问题