gpt4 book ai didi

oracle - 改变主键

转载 作者:行者123 更新时间:2023-12-01 15:38:55 31 4
gpt4 key购买 nike

我见过两种更改主键的方法。方法 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;
/

那么现在我的问题是

  1. 除了步骤分开之外,这两种方法在后端有什么不同吗?
  2. 我看到我们可以用引号提及列名称,即 "COL1" 或不带引号,即 COL1。这两种方法会有什么不同吗?
  3. 考虑这些步骤是在一个拥有数万亿数据的表上执行的,这些步骤中的任何一个相对于其他步骤是否有任何性能提升?

最佳答案

DDL 与您所拥有的完全一样,据我所知,两者之间没有区别。 (这是基于比较 select dbms_metadata.get_ddl('TABLE', 'TABLE_NAME') from dual; 、一些简单的性能测试,以及我以前处理这两种方法的经验。)

但如果你有数万亿行或字节,那么你可能应该使用并行性,然后就会有显着差异。第一种方法不允许您并行创建索引 ( ORA-03001: unimplemented feature ),但第二种方法可以。即使您不希望索引是并行的,您也应该并行创建它,然后使用类似 ALTER INDEX <index> NOPARALLEL; 的命令将其更改为 noparallel。


至于双引号,当列全部大写时它们没有区别。但是,如果您使用大小写混合,则意味着该名称区分大小写,您必须始终使用引号来引用该名称。这真的很烦人,所以我通常会删除引号以防止意外创建区分大小写的名称。


一些其他注意事项。您可能需要考虑使用 NOLOGGING。而且不需要 COMMIT; , DDL 将自动导致提交。

关于oracle - 改变主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7959297/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com