【问题标题】:Replacing PK's in Existing SQL DB Tables替换现有 SQL 数据库表中的 PK
【发布时间】:2011-04-28 17:30:27
【问题描述】:

现在我有一个数据库,其中 PK 是 int IDENTITY。去年,我最近的任务是将这些添加到复制拓扑中。除了 IDENTITY 字段之外,这已经很好地解决了。

我想探索使用uniqeidentifier(GUID) 更改或替换它们的选项。
插入一个新的PK列是否可行?
将其增加到big int 会更好吗?

还有什么我应该考虑的吗?


详细说明我为什么要这样做:

据我了解,当 Replication 遇到 IDENTITY 列时,它会为每个订阅者预留一个身份范围,例如 1-1000(默认),以确保该列的唯一 INT。您拥有的订阅者越多,它可能会成为更大的问题。这导致了我们不断收到的身份范围检查约束错误。

谢谢

【问题讨论】:

  • 您不能只添加一个新的 GUID 列以用于复制吗?只需添加 - 而不是替换 - 可能会更容易(如果可行的话)
  • 必须完成它才能使用复制并完成。我要解决的问题是“身份范围检查约束”,这与复制如何处理身份字段直接相关。
  • 所以在这种情况下,我会添加一个新的 GUID 字段,并使其成为 PK - 但一个非集群的 PK - 并将 INT IDENTITY 保留在适当的位置作为集群键在桌子上。否则你的表现可能会受到很大影响......
  • @marc_s - 如果您经常更新,GUID 上的集群对热点没有帮助吗?
  • @JNK:自 SQL SErver v7 以来,热点可能不再存在 - 但 GUID 上的集群会给您带来可怕的索引碎片并损害性能......

标签: sql sql-server-2005 primary-key replication identity-column


【解决方案1】:

如果您确实必须删除 INT IDENTITY 列,那么您必须执行以下步骤(或多或少):

  • 在表中创建新的 GUID 列并用值填充它
  • 识别所有引用该表的外键关系并记下这些关系(例如,将它们的 CREATE 脚本存储在磁盘上或其他东西上)
  • 向所有引用表添加新的 GUID 引用字段
  • 根据您已有的 INT 参考字段填写这些值
  • 删除所有对表的 FK 引用
  • 将 INT IDENTITY PK 放到您的桌子上
  • 让新的 GUID 列成为您的 PK
  • 从所有引用表中删除旧的 INT 引用列
  • 使用新的 GUID 引用列重新创建所有外键引用

我希望这能解决问题。

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多