Oracle12c 唯一索引与使用唯一索引的唯一约束

Oracle12c 唯一索引与使用唯一索引的唯一约束,oracle12c,Oracle12c,我试图比较两个模式,以确保它们是同步的。在一个模式中,我在两列上看到一个唯一的索引。除此之外,我还看到一个使用唯一索引的唯一约束 我是Oracle的新手,但我对Oracle的一般理解和唯一约束只能确保没有重复项,也就是说它不必编制索引。为了提高性能,应在FK列上添加索引,以便有效执行约束 在我的目标数据库中,我只有唯一的索引HD_FILL_dispnng_FEE_VAL_AK1 由于该索引被标记为“唯一”,这难道不提供索引的唯一约束和性能优势吗?我看到很多关于这个主题的帖子,比如引用的链接,但是

我试图比较两个模式,以确保它们是同步的。在一个模式中,我在两列上看到一个唯一的索引。除此之外,我还看到一个使用唯一索引的唯一约束

我是Oracle的新手,但我对Oracle的一般理解和唯一约束只能确保没有重复项,也就是说它不必编制索引。为了提高性能,应在FK列上添加索引,以便有效执行约束

在我的目标数据库中,我只有唯一的索引HD_FILL_dispnng_FEE_VAL_AK1

由于该索引被标记为“唯一”,这难道不提供索引的唯一约束和性能优势吗?我看到很多关于这个主题的帖子,比如引用的链接,但是我很难将它应用到这个特殊的情况

问题:由于我有唯一索引,删除唯一约束是否会有任何负面影响?类似地,使用索引的唯一约束与使用唯一索引的唯一约束有何不同

CREATE UNIQUE INDEX RXFINODS_O.HD_FILL_DISPNSNG_FEE_VAL_AK1 ON RXFINODS_O.HD_FILL_DISPNSNG_FEE_VAL
(CVRG_TY_CD, VAL_EFF_START_DT)
LOGGING
TABLESPACE RXFINODS_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
NOPARALLEL;

-- 
-- Non Foreign Key Constraints for Table HD_FILL_DISPNSNG_FEE_VAL 
-- 
ALTER TABLE RXFINODS_O.HD_FILL_DISPNSNG_FEE_VAL ADD (
  CONSTRAINT HD_FILL_DSPSNG_FEE_VAL_AK1
  UNIQUE (CVRG_TY_CD, VAL_EFF_START_DT)
  USING INDEX .HD_FILL_DISPNSNG_FEE_VAL_AK1
  ENABLE VALIDATE);
“它不一定是索引的。”出于性能原因,Oracle始终会确保任何唯一约束(包括主键约束)都有索引。默认情况下,Oracle将在创建唯一约束时创建唯一索引


“使用不同于唯一索引的索引的唯一约束如何实现?”

索引允许重复条目

示例1:可延迟的约束。插入时,索引需要允许重复条目,因为在事务提交之前允许重复条目。然后在提交时,Oracle检查重复项

示例2:出于性能原因,A、B和C上需要索引。A上需要唯一约束。可以告诉Oracle使用A、B和C上的索引来强制A上的唯一约束,即使索引是非唯一的。因此,Oracle将不必维护另一个索引


“由于我有唯一索引,删除唯一约束是否会有任何负面影响?”


删除约束没有好处。

Re:“出于性能原因,Oracle总是会确保任何唯一约束(包括主键约束)都有一个索引。”Q:但如果您有一个唯一索引,那么使用该唯一索引的唯一约束是否也有好处?这听起来是多余的。回复:“索引允许重复条目。”即使索引是唯一的索引?“UNIQUE”似乎是索引和约束的一个属性。Re:您的“ABC”列示例,如果a列本身有唯一约束,那么索引a、B、C也应该是unique@ChadD,但Oracle不会在a、B、C上使用唯一索引来强制a上的唯一约束。(不知道为什么。)
create table t(a数字、b数字、c数字、约束t_a_uk unique(a)使用索引(在t(a,b,c)上创建索引t_a_b_c_idx))
工作。
使用索引创建表t(a数字、b数字、c数字、约束t_a_uk unique(a)(在t(a,b,c)上创建唯一索引t_a_b_c_idx)))
产生
ORA-14196:指定的索引不能用于强制执行约束。
“同时具有使用该唯一索引的唯一约束有什么好处?”唯一约束是一个逻辑概念,使用约束文档意图。唯一索引不是文档意图,而是实现。正如在对您链接的问题的回答中所指出的,唯一索引不能作为外键约束的目标,只能是唯一约束和主键约束。