constraint 指定index 提高enable性能, PK validate 隐式 not null

本文讨论了在Oracle数据库中创建唯一索引(idx1)并尝试使用它来添加一个名为test_con_u1的唯一约束时遇到的错误。重点在于novalidate选项对约束默认行为的影响以及如何正确启用和修改约束的自动非空属性。
摘要由CSDN通过智能技术生成

This is expected behavior as seen in the following example:

create table test_con(
   c1 varchar2(10),
   c2 number,
   c3 date,
 c4 varchar2(10));

create index idx1 on test_con(upper(c4));   <---Index is created using the upper function on column c4

Index created

alter table test_con add constraint test_con_u1 unique(c4) using index idx1 enable novalidate;   <---error is raised

ERROR at line 1:
ORA-14196: Specified index cannot be used to enforce the constraint. 

--alter table test_con add constraint test_con_u1 unique(c4) 直接这个会新建一个unique index 和key


 select column_name from user_ind_columns where index_name = 'IDX1';

COLUMN_NAME
--------------------------------------------------------------------------------
SYS_NC00005$

SQL> alter table test_con add  constraint test_con_u1 unique("SYS_NC00005$") using index idx1 enable novalidate;

Table altered.

ALTER TABLE SYSTEM.TEST_CON ADD (
  CONSTRAINT TEST_CON_U1
  UNIQUE (SYS_NC00005$)
  USING INDEX system.IDX1----ORA-00907: missing right parenthesis --no need system.
  ENABLE VALIDATE);

-----------PK enable时自动非空,但是novalidate时不自动--disable validate 也是强制非空的----

SQL>  alter table TEST_CON modify constraint TEST_CON_PK1 enable novalidate;

Table altered


SQL> desc TEST_CON
Name Type         Nullable Default Comments 
---- ------------ -------- ------- -------- 
C1   VARCHAR2(10) Y                         
C2   NUMBER       Y                         
C3   DATE         Y                         
C4   VARCHAR2(10) Y                         

SQL> alter table TEST_CON modify constraint TEST_CON_PK1 enable;

Table altered


SQL> desc TEST_CON
Name Type         Nullable Default Comments 
---- ------------ -------- ------- -------- 
C1   VARCHAR2(10) Y                         
C2   NUMBER       Y                         
C3   DATE         Y                         
C4   VARCHAR2(10)                           

SQL> 


 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值