روشی برای تغییر ایندکس primary key – اوراکل 12c

شرایط زیر را در نظر بگیرید:

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

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.