2016-09-13 33 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

没问题,我已经编辑它来使你的意思更清晰。 –

相关问题