oracle - 在 Oracle 中,唯一约束是否隐式包含索引?

标签 oracle performance indexing constraints unique

这个问题是针对性能问题, 例如,如果我要添加一个唯一约束,例如:

ALTER TABLE Staffs ADD CONSTRAINT test UNIQUE (Company_Name, Staff_ID);

我应该为性能问题添加唯一索引吗?

CREATE UNIQUE INDEX test2 ON Staffs (Company_Name, Staff_ID); 

对于Primary key,我可以看到dba_indexes系统表中肯定有对应的索引, 但我还没有看到 case 唯一约束的等价物

最佳答案

"I have not seen the equivalent for the case unique constraint"

嗯嗯,你确定吗?

SQL> create table t23
  2  (id number
  3   , col1 date)
  4  /

Table created.

SQL> alter table t23
  2  add constraint t23_uk unique (id)
  3  /

Table altered.

SQL> select index_name, uniqueness
  2  from user_indexes
  3  where table_name='T23'
  4  /

INDEX_NAME                     UNIQUENES
------------------------------ ---------
T23_UK                         UNIQUE

SQL> 

请注意,我们可以使用现有索引,它不必是唯一的。但这意味着索引名称可能与约束名称不匹配(这也适用于主键):

SQL> alter table t23 drop constraint t23_uk;

Table altered.

SQL> select index_name, uniqueness
  2  from user_indexes
  3  where table_name='T23'
  4  /

no rows selected

SQL> create index t23_idx on t23(id)
  2  /

Index created.

SQL> select index_name, uniqueness
  2  from user_indexes
  3   where table_name='T23'
  4  /

INDEX_NAME                     UNIQUENES
------------------------------ ---------
T23_IDX                        NONUNIQUE

SQL> alter table t23
  2  add constraint t23_uk unique (id)
  3  /

Table altered.

SQL>

非唯一索引是否强制执行唯一约束?是的:

SQL> insert into t23 values (1, sysdate)
  2  /

1 row created.

SQL> r
  1* insert into t23 values (1, sysdate)
insert into t23 values (1, sysdate)
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T23_UK) violated

SQL> drop index t23_idx 
  2  /
drop index t23_idx
           *
ERROR at line 1:
ORA-02429: cannot drop index used for enforcement of unique/primary key


SQL> 

我们可以检查数据字典以查看哪个索引与约束相关联:

SQL> select constraint_name, constraint_type, index_name
  2  from user_constraints
  3  where table_name = 'T23'
  4  /

CONSTRAINT_NAME                C INDEX_NAME
------------------------------ - ------------------------------
T23_UK                         U T23_IDX

SQL> 

关于oracle - 在 Oracle 中,唯一约束是否隐式包含索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27163473/

相关文章:

c++ - 重复调用 - 编码练习

mysql - 我可以使用多个字段作为 MySQL 中的 IGNORE 限定符来执行 INSERT IGNORE 吗?

mySQL 针对 NxM 字符串搜索的优化

xml - 使用 PL/SQL 解析 SOAP 响应

c++ - 为什么此代码在 Mac 和 Red Hat 中运行如此不同

c# - 从 Oracle 数据库表填充 DataTable - C#

python - 为什么 collections.deque 比 collections.defaultdict 慢?

javascript - Javascript 中使用菊花链三元处理数组和平均值的解决方案?

mysql - 我如何决定何时使用右连接/左连接或内连接或者如何确定哪个表在哪一侧?

sql - 预聚合/已按指标分组的中值计算