如何更改现有表以在 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

通过动态增加拆分在 oracle 中创建拆分分区

如何过滤我的表以在 Oracle 中显示结果?

如何在光滑的滑块中创建自定义箭头以在悬停时更改图像?

如何将现有用户的权限授予我在 Oracle 中创建的用户?谢谢

在 SQL Server 2012 中创建以日期为范围分区的表