我见过两种改变主键的方法。方法1是我删除主键(它也删除相应的索引),然后创建一个带有新索引的主键,即
。alter table TABLE_NAME drop constraint PK_TABLE_NAME drop index;
alter table TABLE_NAME
add constraint PK_TABLE_NAME PRIMARY KEY ("COL1")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE;
COMMIT;
/
第二种方法是单独进行所有步骤,即
alter table TABLE_NAME drop constraint PK_TABLE_NAME;
drop index PK_TABLE_NAME;
CREATE UNIQUE INDEX PK_TABLE_NAME ON TABLE_NAME
(COL1)
LOGGING
TABLESPACE USERS
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
NOPARALLEL;
alter table TABLE_NAME add constraint PK_TABLE_NAME PRIMARY KEY ("COL1") USING INDEX PK_TABLE_NAME;
COMMIT;
/
所以现在我的问题是
答案 0 :(得分:2)
完全按照你的方式使用DDL,据我所知,两者之间没有区别。 (这是基于比较select dbms_metadata.get_ddl('TABLE', 'TABLE_NAME') from dual;
,一些简单的性能测试,以及我之前处理这两种方法的经验。)
但是如果你有数万亿行或字节,那么你应该使用并行性,然后有一个显着的区别。第一种方法不允许您并行创建索引(ORA-03001: unimplemented feature
),但第二种方法可以。
即使您不希望索引是并行的,您也应该并行创建它,然后将其更改为noparallel。
对于双引号,当列全部为大写时,它们没有区别。但是,如果您使用混合大小写,则表示该名称区分大小写,您必须始终使用引号来引用该名称。这真的很烦人,所以我通常会删除引号以防止意外创建区分大小写的名称。
其他一些说明。您可能需要考虑使用NOLOGGING。并且不需要COMMIT;
,DDL将自动导致提交。