我需要一个带有 Oracle 标识列的主键吗?
Do I need a primary key with an Oracle identity column?
我正在使用 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")
);
由于 ID 自动来自序列,因此它始终是唯一的。
ID 列是否需要 PK,如果需要,是否会影响性能?
索引是否会在 INSERT
上以更好的性能产生相同的结果?
是的,如果 ID 列确实(并且应该)是唯一的,那么您始终应该在 ID 列上设置唯一性约束(除了极少数例外),无论填充它的方法如何 - 值是否由您的应用程序代码或通过 IDENTITY
列。
不,您不一定需要主键,但您应该始终向优化器提供尽可能多的数据信息尽可能 - 尽可能包括唯一约束。
对于代理键(如您的 ID
),将其声明为主键几乎总是合适的,因为它最有可能成为引用约束的候选者。
您 可以 在 ID
上使用普通索引,并且查找性能将根据数据量进行比较 - 但在这种情况下实际上没有充分的理由使用非唯一索引而不是唯一索引 - 在这种情况下没有充分的理由避免无论如何都需要索引的约束。
我正在使用 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")
);
由于 ID 自动来自序列,因此它始终是唯一的。
ID 列是否需要 PK,如果需要,是否会影响性能?
索引是否会在 INSERT
上以更好的性能产生相同的结果?
是的,如果 ID 列确实(并且应该)是唯一的,那么您始终应该在 ID 列上设置唯一性约束(除了极少数例外),无论填充它的方法如何 - 值是否由您的应用程序代码或通过 IDENTITY
列。
不,您不一定需要主键,但您应该始终向优化器提供尽可能多的数据信息尽可能 - 尽可能包括唯一约束。
对于代理键(如您的 ID
),将其声明为主键几乎总是合适的,因为它最有可能成为引用约束的候选者。
您 可以 在 ID
上使用普通索引,并且查找性能将根据数据量进行比较 - 但在这种情况下实际上没有充分的理由使用非唯一索引而不是唯一索引 - 在这种情况下没有充分的理由避免无论如何都需要索引的约束。