شرایط زیر را در نظر بگیرید:
SQL> create table jadval1 (id number,name varchar2(14),last_name varchar2(14));
Table created
SQL> insert into jadval1 select level,’VAHID’,’USEFZADEH’ from dual connect by level <=10000;
10000 rows inserted
SQL> commit;
Commit complete
SQL> create index ind_id on jadval1(id);
Index created
در چنین شرایطی قصد داریم ستون id را به عنوان primary key تعریف کنیم:
SQL> alter table JADVAL1 add constraint pk primary key (ID);
Table altered
پس از ایجاد PK خواهیم دید که این constraint از همان ایندکس Non-Unique استفاده می کند:
SQL> select p.CONSTRAINT_NAME,p.INDEX_NAME,p.CONSTRAINT_TYPE from dba_constraints p where p.TABLE_NAME=’JADVAL1′;
CONSTRAINT_NAME INDEX_NAME C
——————– ——————– ——-
PK IND_ID P
SQL> drop index ind_id;
ORA-02429: cannot drop index used for enforcement of unique/primary key
تصمیم داریم ایندکس Uniqueای را برای ستون id ایجاد کرده(بصورت invisible) و نهایتا ان را برای primary key تنظیم کنیم برای این کار روشهای مختلفی وجود دارد که یکی از روشهای نسبتا ساده آن، استفاده از دستور alter table … modify constraint می باشد:
SQL> create unique index ind_id_pk on jadval1(id) invisible;
Index created
SQL> alter table jadval1 modify constraint pk using index ind_id_pk;
Table altered
SQL> select p.CONSTRAINT_NAME,p.INDEX_NAME,p.CONSTRAINT_TYPE from dba_constraints p where p.TABLE_NAME=’JADVAL1′;
CONSTRAINT_NAME INDEX_NAME C
————— ———– ——
PK IND_ID_PK P
SQL> select VISIBILITY from dba_indexes where index_name=upper(‘ind_id_pk’);
VISIBILITY
———-
INVISIBLE
SQL> drop index ind_id;
Index dropped
SQL> alter index ind_id_pk VISIBLE;
Index altered
SQL> drop index ind_id_pk;
ORA-02429: cannot drop index used for enforcement of unique/primary key
البته این مسئله صرفا به ایندکسهای unique محدود نمی شود:
SQL> create index ind_id_name on jadval1(id,name) ;
Index created
SQL> alter table jadval1 modify constraint pk using index ind_id_name;
Table altered
SQL> select p.CONSTRAINT_NAME,p.INDEX_NAME,p.CONSTRAINT_TYPE from dba_constraints p where p.TABLE_NAME=’JADVAL1′;
CONSTRAINT_NAME INDEX_NAME C
————————— ——————– ————
PK IND_ID_NAME P