我需要更改表的唯一ID列

时间:2011-09-28 13:05:51

标签: sql-server sql-server-2000

不确定这样做的最佳方法,或者是否有一个最佳答案,但问题出在此处:

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

到目前为止我?

现在,客户端希望能够在数据库中插入多个sysnames值(alpha001,alpha001,alpha001,alpha002,alpha002,alpha003,alpha003,alpha003,alpha003,alpha003等)。最重要的是,如果你在一个表中更改了一个sysname(alpha001到beta001)的值,那么其他一些表中的值也会更新(我现在对于这个调用的内容有一个大脑放屁) 。

我还想添加一个新列(SysNameID)并将其设置为自动增量。执行此操作的最佳方法是什么,以便它将通过数据库并添加SysNameID值(1,2,3,4,5,6 ...),以便我不必重建桌子?

我想我需要在所有受影响的表中添加SysNameID列,并在表之间设置(大脑放屁术语)以保留相关性(出于数据完整性目的)。

如果这个请求不清楚,请发表评论,我会尽力回答。你们中的一些人非常聪明,所以你可能不得不为我愚蠢。 :)

2 个答案:

答案 0 :(得分:3)

我不完全理解您当前sysname列的问题/挑战....

但是对于第二部分:是的,你可以轻松地在你的表中添加一个自动增量列,不,你不必做任何事情(比如“重建表” - 无论应该是什么.....) - SQL Server将为您填充具有自动增量值的现有行。$

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

我通常建议将IDENTITY列作为表的主(和群集)键,或者如果不可能,至少在列上放置一个UNIQUE CONSTRAINT以防止插入重复值:< / p>

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

答案 1 :(得分:3)

基本流程:

确保您拥有当前备份,并且在没有首先通过devel测试进行测试的情况下不要尝试在prod上执行此操作。这是一个如此广泛的变化,您可能希望将prod恢复到新的dev实例,因为它会耗费时间并且非常棘手,并且在您执行此操作时会受到其他开发的干扰。

将标识列添加到名为SysNameID的父表中(有关详细信息,请参阅@marc_s'的答案)

为每个名为SysNameId的子表添加一个int列。它不是自动增量列,必须允许空值。

您可以使用当前的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