【问题标题】:Change range value in table partition更改表分区中的范围值
【发布时间】:2012-05-01 10:12:11
【问题描述】:

我有一张带分区的大桌子。 例如:

CREATE TABLE cust_order (
cust_id     NUMBER(10), 
start_date   VARCHAR2(25), 
amount_sold NUMBER(10,2))
PARTITION BY RANGE (START_DATE)
(  
PARTITION MAY VALUES LESS THAN ('20120601'),
PARTITION DEF VALUES LESS THAN(MAXVALUE));

我想更改表,使MAY 分区包含小于“20120501”的值,并且从“20120501”到“20120601”的数据存储在DEF 分区中。

【问题讨论】:

    标签: sql oracle partitioning toad plsqldeveloper


    【解决方案1】:

    首先,您应该始终将日期存储在DATE 列中。将日期存储在 VARCHAR2(25) 列中会导致问题的发生——有人将不可避免地插入格式不正确的字符串。

    其次,假设MAYDEF分区之间没有分区,可以拆分MAY分区

    ALTER TABLE cust_order
      SPLIT PARTITION may AT ('20120501')
       INTO( PARTITION may,
             PARTITION june_temp )
     UPDATE GLOBAL INDEXES;
    

    然后合并JUNE_TEMPDEF分区

    ALTER TABLE cust_order
      MERGE PARTITIONS june_temp, def
       INTO PARTITION  def
    

    我不确定我是否看到了这样做的智慧……默认分区通常不应该存储任何数据——它通常只存在于那里,以便插入在意外发生时不会出错大分区键。因此,将已经在一个分区中的数据移动到默认分区中似乎很奇怪。如果您将来只是要创建一个JUNE 分区,我不确定您为什么不将分区拆分为MAYJUNE 分区。

    【讨论】:

    • 你好贾斯汀,是的 1) 但这就是它的实现方式。我想“拆分” MAY 分区,以便小于 20120501 的值转到 MAY,而不再适合该分区的值转到 DEF。
    • @odew - 更新了你的问题和我的答案。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2017-04-14
    • 2016-06-26
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多