环境:Oracle 11.2.0.3
需求:生产一张表由于前期设计不当,没有主键。现需要添加主键,数据量很大,想并行建立。
1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键
SQL> alter table t add constraint pk_t primary key (object_id) using index online parallel 2;
alter table t add constraint pk_t primary key (object_id) using index online parallel 2
ORA-03001: 未实施的功能
SQL> alter table t add constraint pk_t primary key (object_id) using index online;
Table altered
SQL> alter table t drop primary key;
Table altered
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
总结:
对于已有大量数据的表无法并行建立主键,可以先并行建立惟一性索引然后再加上主键。
主键不能为空,惟一性索引可以为空。