我是否需要带有 Oracle 标识列的主键?

Oli*_*ier 2 oracle oracle12c

我正在使用 Oracle 12c,并且我有一个IDENTITY列设置为GENERATED ALWAYS.

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

   CONSTRAINT "CUSTOMER_ID_PK" PRIMARY KEY ("ID")
);
Run Code Online (Sandbox Code Playgroud)

由于 ID 是自动从序列中生成的,因此它始终是唯一的。

我是否需要在 ID 列上进行 PK?如果需要,是否会影响性能?索引会产生相同的结果但性能更好INSERT吗?

Jef*_*emp 5

不,您不一定需要主键,但您应该始终向优化器提供尽可能多的有关数据的信息 - 包括尽可能的唯一约束。

对于代理键(例如您的ID),将其声明为主键几乎总是合适的,因为它是引用约束最有可能的候选者。

可以在 上使用普通索引ID,并且查找性能将根据数据量进行比较 - 但在这种情况下几乎没有充分的理由使用非唯一索引而不是唯一索引 - 并且没有充分的理由这种情况是为了避免无论如何都需要索引的约束。