更改表分区中的范围值

时间:2012-04-19 20:00:40

标签: sql oracle partitioning toad plsqldeveloper

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

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分区中。

1 个答案:

答案 0 :(得分:3)

首先,您应始终将日期存储在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分区,我不确定为什么您不会将分区拆分为MAY和{{1分区。