2009-07-01 68 views
4

我們使用序列號爲表上的主鍵。 有些表格我們沒有真正使用主鍵來查詢任何目的。 但是,我們在其他列上有索引。這些是非唯一索引。 查詢在WHERE條件中使用這些非主鍵列。Oracle - 在表上沒有主鍵會有什麼影響嗎?

所以,我真的不明白在這樣的表上有一個主鍵的好處。 我對SQL 2000的經驗是,它用於複製有一些主鍵的表。 否則它不會。

我正在使用Oracle 10gR2。我想知道是否有任何 有沒有主鍵的表的副作用。

回答

3

關閉我的頭頂,你不能有一個沒有唯一鍵的外鍵,所以沒有辦法將錶鏈接到其他表。在事實之後改變它並不是微不足道的,因爲訪問這個表的所有代碼都可能受到影響,或者由於移位引用而無法工作,或者以不同的方式執行。另外,我相信我們在uni(但是這是5年前以前)學到獨特的索引對性能更好,因爲行被分割而不考慮它們的內容。

6

有一些表我們並不真正使用主鍵來查詢任何目的。

那麼爲什麼你有一個序列,如果你永遠不會使用它? 每個表格都必須有一個唯一標識記錄的東西,它不需要是人工增量序列(又名surrogate key),它可能是natural key的組合)。總是有一些查詢通過某種唯一鍵(候選鍵)訪問,這意味着你肯定需要一個索引,你也可以使索引唯一。

上有所有持久(非臨時)表強制PK限制的其他好處:

  1. 確保你永遠不會有重複的值(你的申請將不能夠破壞DB )
  2. 幫助外部工具執行自動ER建模
  3. 最後但並非最不重要 - 允許FK約束!
+1

+1報價。 「如果它沒有主鍵,它不是*一張桌子!」 :-) – 2009-07-01 20:55:27

+1

允許在Unique上使用外鍵,因此不需要PK的那個 – 2015-10-18 16:05:26

8

一個表不需要有主鍵。因爲數據庫中的每一行都有一個Oracle用於存儲和某些內部引用的隱式唯一數據點,所以對於數據庫沒有任何影響。這是ROWID僞列。 ROWID是唯一標識數據庫中每一行的數據 - 有一些值得注意的例外。

我的數據庫下面的查詢返回顯示的數據:

 
select rowid from user$ where rownum <= 5; 

AAAAAKAABAAAAFlAAC 
AAAAAKAABAAAAFlAAD 
AAAAAKAABAAAAFiAAD 
AAAAAKAABAAAAFlAAE 
AAAAAKAABAAAAFlAAF 

它不是嚴格必要在一個表上的一個關鍵。我剛纔查詢的Oracle10g數據庫有569個沒有主鍵或唯一鍵的系統表。這是DBA和開發人員應該如何在數據庫表上創建密鑰的決定。我的項目中的開發人員總是創建主鍵,而不管他們的用途或理智。作爲DBA,我只在有意義的地方創建密鑰。

親切的問候,

作品

相關問題