如何更改现有表以在 Oracle 中创建范围分区
Posted
技术标签:
【中文标题】如何更改现有表以在 Oracle 中创建范围分区【英文标题】:How do I alter my existing table to create a range partition in Oracle 【发布时间】:2016-06-26 06:12:20 【问题描述】:我现有的表有 10 年的数据(我已经转储了)。
我想在表中的一个日期键列上对现有表进行 Range 分区。
我看到的大多数示例都是使用CREATE TABLE..PARTITION BY RANGE...
添加新分区。但我的表是现有表。
我想我需要一些ALTER
声明。
ALTER TABLE TABLE_NAME
PARTITION BY RANGE(CREATED_DATE)
PARTITION JAN16 VALUES LESS THAN (01-02-2016),
PARTITION FEB16 VALUES LESS THAN (01-03-2016) AND GREATER THAN(31-01-2016),//OR?
PARTITION MAR16 VALUES BETWEEN (01-03-2016) AND (31-03-2016), //OR?
两个问题..
我需要 Alter 语句来添加分区机制还是需要使用 create 语句?
保持每个分区只有 ONE MONTH 数据的正确语法是什么。
【问题讨论】:
你不能alter
一个表被分区。您需要删除并重新创建它。您只能使用alter
将分区添加到已经分区的表
@a_horse_with_no_name You can not alter a table to be partitioned
其实你可以:)
@lad2025: 但仅限于 dbms_redefinition
,这不完全是 alter
声明
@a_horse_with_no_name 我指的是my answer,而不是DBMS_REDEFINITION。
嗯,那在 2016 年我写评论时是不可能的
【参考方案1】:
如果您使用Oracle 12c Release 2
,您可以使用单个ALTER
将非分区表转换为分区表(这是一种方式):
CREATE TABLE my_tab ( a NUMBER(38,0), b NUMBER(38,0));
ALTER TABLE MY_TAB MODIFY PARTITION BY RANGE (a) INTERVAL (1000) (
PARTITION p1 VALUES LESS THAN (1000)) ONLINE;
你也可以转换索引,添加:
update indexes (index_name [local/global]);
db<>fiddle demo
【讨论】:
当我在上面运行 sql 时,它会抛出一个错误为“Invalid Partition name” @TejuMB 您的版本低于 12R2 演示:dbfiddle.uk/…【参考方案2】:因为您的表未分区,所以您有两个选择:
-
导出数据、删除表、新建分区表、导入数据。
使用拆分然后交换分区方法。 https://oracle-base.com/articles/misc/partitioning-an-existing-table-using-exchange-partition
另外,如果您想每月新建一个分区,请阅读 SET INTERVAL。例如:
CREATE TABLE tst
(col_date DATE)
PARTITION BY RANGE (col_date) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(PARTITION col_date_min VALUES LESS THAN (TO_DATE('2010-01-01', 'YYYY-MM-DD')));
【讨论】:
以上是关于如何更改现有表以在 Oracle 中创建范围分区的主要内容,如果未能解决你的问题,请参考以下文章
如何从 JSON 数组在 DB 中创建表以在 Spring Boot 中创建 REST API