将主键添加到具有现有聚簇索引的表中

问题描述:

我必须使用数据库来完成报告 数据库相当大:416 055 104行 尽管每行都非常轻,只是布尔值和int ids。将主键添加到具有现有聚簇索引的表中

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

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

  1. 请问有没有很好的理由呢?
  2. 有什么办法可以把它变成主键。

关于问题2

创建新的主键还创建了一个非聚集索引与(已经是现有的群集一个那里)相关联。
这是不是我在找什么。我想保持相同的索引,但也要把它作为主键。

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

在不可为空的列上的PRIMARY KEY和UNIQUE约束之间几乎没有区别。所以如果所讨论的列是不可空的,那么我建议你什么都不做。将候选关键字转换为主关键字的主要原因是,如果您有一些软件(如数据建模工具或其他开发工具)需要使用PRIMARY KEY约束来标识关键字。

+0

这就是我最终做的。这种关系对于ORM来说也不是强制性的。我也可以用join来写一个linq查询,这不会是一个问题。 – 2010-08-10 09:21:10

  1. 唯一索引可以允许空值 。主键不能。

  2. 我相信你不能“标记”现有的索引作为主键。你不得不放弃它并重新创建。为了避免这种情况发生,我会说在做之前先把TABLOCKX, HOLDLOCK放在桌上。

+0

我不知道它们是如何设置的,我想也许它们是2个不同的元素,并且主键会对它使用的索引进行“引用”。然后,这只是创建一个PK并告诉它使用现有的。 而且ORM很少玩没有PK ... – 2010-08-09 13:35:41

好问题。

如果你已经有了一个不可空列的唯一索引,那么你有一个候选键。我不知道将其作为“官方”主键有什么特别的好处。事实上,我有一种感觉,不使它成为PK会给予更大的灵活性。

+0

那么,如果我没有一个真正的主键,我不能创建外键... – 2010-08-09 13:32:50

+2

@Stephane - 是的,你可以。要求是在被引用表中有一个唯一的约束,而不是主键。 – 2010-08-09 13:34:06

+0

表中的唯一约束我想要的PK由3列(DocId,CatId,SysId)组成,而我在表中只有DocId我想要外键。我其实不确定现在PK会不会起作用。 – 2010-08-09 14:18:26