2010-04-14 85 views
3

當我注意到一個有趣的行爲時,我在10g中創建了一個新表。這裏是我做的一個例子:Oracle獨特索引

CREATE TABLE test_table (field_1 INTEGER PRIMARY KEY); 

Oracle將默認爲主鍵創建一個非空的唯一索引。我仔細檢查了這一點。快速檢查後,我找到一個唯一索引名稱SYS_C0065645。到目前爲止,一切都按預期工作。現在我這樣做了:

CREATE TABLE test_table (field_1 INTEGER, 
CONSTRAINT pk_test_table PRIMARY KEY (field_1) USING INDEX (CREATE INDEX idx_test_table_00 ON test_table (field_1))); 

在描述我新創建的索引idx_test_table_00後,我發現它是非唯一的。我試圖插入重複的數據到表中,並被主鍵約束停止,證明功能沒有受到影響。對我來說,似乎很奇怪Oracle會允許將非唯一索引用於主鍵約束。爲什麼這是允許的?

回答

5

在唯一索引和非唯一索引之間實際上沒有結構性差異,Oracle可以使用PK約束。允許這樣的PK定義的一個優點是可以禁用或推遲數據加載約束 - 這對於唯一索引是不可能的,因此可以爭辯說這種實現更加靈活。

2

爲什麼不允許它?我喜歡Oracle給你很多選擇和靈活性。

也許你可以創建一個索引,並將其用於兩個目的:

  • 驗證PK
  • 幫助查詢執行得更好

Oracle將默認創建一個非null唯一索引

呵呵,和索引無關與非空方面。

+0

+1表示非空註釋。 – 2010-04-15 05:02:39