2016-09-13 32 views
1

我正在使用Oracle 12c,並且我有一個IDENTITY列設置爲GENERATED ALWAYS我需要一個帶有Oracle標識列的主鍵嗎?

CREATE TABLE Customers 
(
    id   NUMBER GENERATED ALWAYS AS IDENTITY, 
    customerName VARCHAR2(30) NULL, 

    CONSTRAINT "CUSTOMER_ID_PK" PRIMARY KEY ("ID") 
); 

由於ID是自動從一個序列,它將始終是唯一的。

我是否需要ID列上的PK,如果是,是否會影響性能? 索引是否會在INSERT上產生相同的結果並具有更好的性能?

回答

1

不,你不需要主鍵一定,但你應該始終提供優化器爲你的數據儘可能多的信息 - 包括一個獨特的約束只要有可能。

對於代理鍵(例如ID),將其聲明爲主鍵幾乎總是合適的,因爲它是參考約束的最可能候選者。在ID

可以使用普通的索引,查找的性能將取決於數據量是相當的 - 但幾乎沒有很好的理由在這種情況下使用的,而不是唯一索引非唯一索引 - 並且在這種情況下沒有理由避免需要索引的約束。

2

是的,如果確實是(並且應該是)唯一的,那麼您始終應該在ID列上具有唯一性約束(極少數例外),而不管其填充的方法 - 值是否由您提供應用程序代碼或通過IDENTITY列。

+0

實際上,您無法插入「GENERATED ALWAYS IDENTITY」列。然而,你關於唯一性約束的觀點是正確的。 –

+0

@jefry你沒有明白我的觀點。意思是說,PK列不需要是身份,你可以自己插入鍵值 – Rahul

+0

沒問題,我已經編輯它來使你的意思更清晰。 –

相關問題