2010-08-09 69 views
4

我必須使用數據庫來完成報告 數據庫相當大:416 055 104行 儘管每行都非常輕,只是布爾值和int ids。將主鍵添加到具有現有聚簇索引的表中

每行由3列標識,但令我驚訝的是,它沒有主鍵。 只有具有唯一約束的聚集索引。

所以知道,我有2個問題。

  1. 請問有沒有很好的理由呢?
  2. 有什麼辦法可以把它變成主鍵。

關於問題2

創建新的主鍵還創建了一個非聚集索引與(已經是現有的羣集一個那裏)相關聯。
這是不是我在找什麼。我想保持相同的索引,但也要把它作爲主鍵。

  • 可能嗎?
  • 那會更快,再次創建整個索引? (我希望如此)
  • 會有什麼後果? (鎖?崩潰?損壞的數據?)

回答

1

在不可爲空的列上的PRIMARY KEY和UNIQUE約束之間幾乎沒有區別。所以如果所討論的列是不可空的,那麼我建議你什麼都不做。將候選關鍵字轉換爲主關鍵字的主要原因是,如果您有一些軟件(如數據建模工具或其他開發工具)需要使用PRIMARY KEY約束來標識關鍵字。

+0

這就是我最終做的。這種關係對於ORM來說也不是強制性的。我也可以用join來寫一個linq查詢,這不會是一個問題。 – 2010-08-10 09:21:10

1
  1. 唯一索引可以允許空值 。主鍵不能。

  2. 我相信你不能「標記」現有的索引作爲主鍵。你不得不放棄它並重新創建。爲了避免這種情況發生,我會說在做之前先把TABLOCKX, HOLDLOCK放在桌上。

+0

我不知道它們是如何設置的,我想也許它們是2個不同的元素,並且主鍵會對它使用的索引進行「引用」。然後,這只是創建一個PK並告訴它使用現有的。 而且ORM很少玩沒有PK ... – 2010-08-09 13:35:41

1

好問題。

如果你已經有了一個不可空列的唯一索引,那麼你有一個候選鍵。我不知道將其作爲「官方」主鍵有什麼特別的好處。事實上,我有一種感覺,不使它成爲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

相關問題