【问题标题】:Add Primary Key to a table with existing clustered index将主键添加到具有现有聚集索引的表中
【发布时间】:2011-03-27 06:58:06
【问题描述】:

我必须使用数据库来进行报告 数据库很大:416 055 104 行 不过,每一行都很轻,只是布尔值和 int id。

每行由 3 列标识,但令我惊讶的是,上面没有主键。 只有具有唯一约束的聚集索引。

所以知道了,我有 2 个问题。

  1. 有什么好的理由吗?
  2. 有什么办法可以把它变成主键。

关于问题 2

创建一个新的主键也会创建一个非聚集索引来关联(已经有一个现有的聚集索引)。
这不是我要找的。我想保留相同的索引,但也将其设为主键。

  • 有可能吗?
  • 这会比再次创建整个索引更快吗? (希望如此)
  • 会有什么后果? (锁定?崩溃?数据损坏?)

【问题讨论】:

    标签: sql-server-2008 primary-key clustered-index alter


    【解决方案1】:

    在不可为空的列上,PRIMARY KEY 和 UNIQUE 约束几乎没有区别。因此,如果有问题的列不可为空,那么我建议您什么也不做。将候选键设为主键的主要原因是,如果您有一些软件(例如数据建模工具或其他开发工具)期望使用主键约束来标识该键。

    【讨论】:

    • 这就是我最终要做的。这种关系对于 ORM 也不是强制性的。我也可以只写一个带有连接的 linq 查询,毕竟这不会是一个问题。
    【解决方案2】:

    好问题。

    如果您已经在不可为空的列上有一个唯一索引,那么您就有一个候选键。我不知道将其设为“官方”主键有什么特别的好处。其实我有一种感觉,不做PK会提供更大的灵活性。

    【讨论】:

    • @Stephane - 是的,你可以。要求是被引用的表中存在唯一约束而不是主键。
    • 我想要 PK 的表中的唯一约束由 3 列(DocId、CatId、SysId)组成,而我想要外键的表中只有 DocId。实际上我现在不确定 PK 是否会成功。
    【解决方案3】:
    1. 唯一索引可以允许 null 价值观。主键不能。

    2. 我相信您不能将现有索引“标记”为主键。您必须删除它并重新创建。为避免出现问题,我建议在此之前将TABLOCKX, HOLDLOCK 放在桌子上。

    【讨论】:

    • 我不知道它们是如何设置的,我认为它们可能是 2 个不同的元素,并且主键会有点“引用”它使用的索引.. 那么这只是一个创建一个 PK 并告诉它使用现有的问题。而且 ORM 很少在没有 PK 的情况下发挥出色...
    猜你喜欢
    • 2015-10-13
    • 2021-12-14
    • 2012-12-30
    • 2021-02-16
    • 2012-06-03
    • 1970-01-01
    • 2015-02-24
    • 2012-08-01
    • 2014-07-30
    相关资源
    最近更新 更多