Sitting in the lounge waiting to be called for my flight I was musing on the 12c feature of having multiple indexes defined on the same ordered column set when a thought crossed my mind and I decided to run a little test that looked like this:
create table t1 as select * from all_objects where rownum <= 10000; create unique index t1_pk on t1(object_id); alter table t1 add constraint t1_pk primary key(object_id); create index t1_i1 on t1(object_id, object_name); drop index t1_pk; /* expect ORA-02429: cannot drop index used for enforcement of unique/primary key */ alter table t1 modify primary key using index t1_i1; drop index t1_pk;
For years I’ve been assuming that you really have to mess around with the PK (and any related FKs) if you want to change the index supporting the primary key – but this code demonstrates that you can add a new index to a table and “move” the primary key to it before dropping the original index.
The worrying thing about this (for me, at any rate) is that it isn’t a new feature – after testing it on 22.214.171.124 I started working backwards, and it works down to 126.96.36.199 (the earlist 9i I have access to). It doesn’t work on 188.8.131.52, and the 184.108.40.206 version behaves slightly differently from later versions because the original PK index disappears as the constraint is moved.
As I’ve often said about trust – keep an eye on the date and version of any article you read, it may no longer be true.