索引和主键:
对于非分区索引,
1 单列索引时,可以直接在索引列上强制主键而不会建立索引
2 组合索引时,可以在前缀列上直接加强制主键不会建立索引, 而对于非前缀列,会加额外的索引
对于分区索引:
分区列必须是主键索引列的子集,才能使用已有索引。 如果不是的话,会新建索引
SQL> conn song/song
Connected.
SQL> drop table test purge;
Table dropped.
SQL> create table test as select * from dba_users;
Table created.
SQL> create index idx_test on test(username);
Index created.
SQL> select index_name from user_indexes where table_name='TEST'
INDEX_NAME
------------------------------------------------------------
IDX_TEST
SQL> alter table test add primary key (username);
Table altered.
SQL> select index_name from user_indexes where table_name='TEST';
INDEX_NAME
------------------------------------------------------------
IDX_TEST
SQL> drop table test purge;
Table dropped.
SQL> create table test as select * from dba_users;
Table created.
SQL> create index idx_test on test (username,user_id)
Index created.
SQL> alter table test add primary key (username);
Table altered.
SQL> select index_name from user_indexes where table_name='TEST';
INDEX_NAME
------------------------------------------------------------
IDX_TEST
SQL> alter table test drop primary key;
Table altered.
SQL> alter table test add primary key (user_id);
Table altered.
SQL> select index_name from user_indexes where table_name='TEST';
INDEX_NAME
------------------------------------------------------------
SYS_C007589
IDX_TEST
SQL> select COLUMN_NAME from dba_ind_columns where index_name='SYS_C007589';
COLUMN_NAME
--------------------------------------------------------------------------------
USER_ID
2 关于分区索引的:
SQL> create table test as select * from dba_users;
Table created.
SQL> create index idx_test_part on test (user_id,username,LOCK_DATE)
2 global partition by range (user_id)
3 (partition p1 values less than (10),
4 partition p2 values less than (20),
5 partition p_max values less than (maxvalue));
Index created.
SQL>
SQL>
SQL> select index_name from dba_indexes where table_name='TEST';
INDEX_NAME
------------------------------------------------------------
IDX_TEST_PART
SQL> ALTER TABLE TEST ADD PRIMARY KEY (USER_ID);
Table altered.
SQL> select index_name from user_indexes where table_name='TEST';
INDEX_NAME
------------------------------------------------------------
IDX_TEST_PART
SQL> alter table test drop primary key ;
Table altered.
SQL> ALTER TABLE TEST ADD PRIMARY KEY (USER_ID,username);
Table altered.
SQL> select index_name from user_indexes where table_name='TEST';
INDEX_NAME
------------------------------------------------------------
IDX_TEST_PART
SQL> alter table test drop primary key ;
Table altered.
SQL> ALTER TABLE TEST ADD PRIMARY KEY (username);
Table altered.
SQL> select index_name from user_indexes where table_name='TEST';
INDEX_NAME
------------------------------------------------------------
SYS_C007600
IDX_TEST_PART