6

我有两个具有 10-2000 万行的表,它们具有 GUID 主键,并且至少有 12 个通过外键相关的表。每个基表有 10-20 个索引。

我们正在从 GUID 转移到 BigInt 主键。我想知道是否有人对方法有任何建议。现在这是我正在考虑的方法:

  1. 删除所有涉及的表上的所有索引和 fkey。
  2. 将“NewPrimaryKey”列添加到每个表
  3. 在两个基表上制作密钥标识
  4. 编写数据更改脚本“更新表 x,设置 NewPrimaryKey = y where OldPrimaryKey = z
  5. 将原始主键重命名为“oldprimarykey”
  6. 将“NewPrimaryKey”列重命名为“PrimaryKey”
  7. 编写所有索引和 fkey 的脚本

这看起来是个好方法吗?有谁知道可以对此有所帮助的工具或脚本?

TD:根据附加信息进行编辑。请参阅此博客文章,该文章解决了 GUID 为主时的方法: http ://www.sqlmag.com/blogs/sql-server-questions-answered/sql-server-questions-answered/tabid/1977/entryid/12749 /默认.aspx

4

3 回答 3

3

你的方法就是我会怎么做。

你真的需要bigint吗?常规的 4 字节 int 将达到 20 亿(2,147,483,647)。

int、bigint、smallint 和 tinyint

于 2010-04-28T14:29:52.200 回答
0

听起来这种策略肯定会奏效——删除约束,从它们下面更改列(类型更改,名称保持不变),然后重新创建约束是相当优雅的。

最终删除 GUID 列的目标是什么?如果是这样,除非复制或重建表,否则您实际上不会回收空间,因此可能进行以下调整:

...
4.脚本数据更改“更新表 x,设置 NewPrimaryKey = y where OldPrimaryKey = z
5.将原始主键删除为 'oldprimarykey'
6.重命名 'NewPrimaryKey' 列 'PrimaryKey'
7.脚本返回所有索引和 fkeys(构建聚集索引“重建”表)
8.对于所有没有聚集索引的表,做一些事情来确保它们被重建并回收它们的空间(比如构建然后删除聚集索引)

不用说,在生产环境运行之前,先在开发设备上进行测试!

于 2010-04-28T14:36:42.143 回答
0

我还要补充:

在开始之前,请确保您有一个良好的当前备份。将服务器更改为以单用户模式运行(先通知用户中断时间)。您不希望用户在此过程中尝试输入数据。

于 2010-04-28T14:45:50.023 回答