【问题标题】:How do I alter my existing table to create a range partition in Oracle如何更改现有表以在 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?

两个问题..

  1. 我需要 Alter 语句来添加分区机制还是需要使用 create 语句?

  2. 保持每个分区只有 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 年我写评论时是不可能的

标签: oracle create-table alter-table partition


【解决方案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】:

因为您的表未分区,所以您有两个选择:

  1. 导出数据、删除表、新建分区表、导入数据。
  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')));

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多