2.考虑先并行添加惟一性索引,再添加主键
SQL> create unique index pk_t on t(object_id) parallel 2 online; Index created
SQL> alter table t add constraint pk_t primary key (object_id); Table altered
SQL> alter index pk_t noparallel; Index altered
3.对比主键和惟一性索引的区别
SQL> desc t
Name Type Nullable Default Comments -------------- ------------- -------- ------- -------- OWNER VARCHAR2(30) Y
OBJECT_NAME VARCHAR2(128) Y
SUBOBJECT_NAME VARCHAR2(30) Y
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER Y
OBJECT_TYPE VARCHAR2(19) Y
CREATED DATE Y
LAST_DDL_TIME DATE Y
TIMESTAMP VARCHAR2(19) Y
STATUS VARCHAR2(7) Y
TEMPORARY VARCHAR2(1) Y
GENERATED VARCHAR2(1) Y
SECONDARY VARCHAR2(1) Y
NAMESPACE NUMBER Y
EDITION_NAME VARCHAR2(30) Y
SQL> alter table t drop primary key; Table altered
SQL> desc t
Name Type Nullable Default Comments -------------- ------------- -------- ------- -------- OWNER VARCHAR2(30) Y
OBJECT_NAME VARCHAR2(128) Y
SUBOBJECT_NAME VARCHAR2(30) Y
OBJECT_ID NUMBER Y
DATA_OBJECT_ID NUMBER Y
OBJECT_TYPE VARCHAR2(19) Y
CREATED DATE Y
LAST_DDL_TIME DATE Y
TIMESTAMP VARCHAR2(19) Y
STATUS VARCHAR2(7) Y
TEMPORARY VARCHAR2(1) Y
GENERATED VARCHAR2(1) Y
SECONDARY VARCHAR2(1) Y
NAMESPACE NUMBER Y
EDITION_NAME VARCHAR2(30) Y
注意:
对于已有大量数据的表无法并行建立主键,可以先并行建立惟一性索引然后再加上主键。
主键不能为空,惟一性索引可以为空。
另外获得的一个经验教训是:
我们知道oracle监听关闭后新session无法连接,已经存在的session仍会继续存活.当我关闭监听要并行创建索引时提示有重复数据,于是去除重复数据。
纳闷的是删除完重复数据后即刻又出现了重复数据,只是数量较原来少.后来和同事沟通才恍然大悟。oracle监听关闭原理都明白,真正应用到实践中还是需要用心体察。最后,在关闭oracle监听情况下重启数据库,再并行创建唯一索引,然后添加对应主键,问题终于得到解决.
最后,本案例过程中涉及到的删除重复数据请参见:http://blog.itpub.net/29119536/viewspace-1661040/
主键与主键索引关系请参见:http://blog.itpub.net/29119536/viewspace-1661582/