我有一个带分区的大桌子。 例如:
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
分区中。
答案 0 :(得分:3)
首先,您应始终将日期存储在DATE
列中。在VARCHAR2(25)
列中存储日期是导致问题的一个方法 - 有人将不可避免地插入具有意外格式的字符串。
其次,假设MAY
和DEF
分区之间没有分区,您可以拆分MAY
分区
ALTER TABLE cust_order
SPLIT PARTITION may AT ('20120501')
INTO( PARTITION may,
PARTITION june_temp )
UPDATE GLOBAL INDEXES;
然后合并JUNE_TEMP
和DEF
分区
ALTER TABLE cust_order
MERGE PARTITIONS june_temp, def
INTO PARTITION def
我不确定我是否看到了这样做的智慧......默认分区通常不应该存储任何数据 - 它通常只存在于那里以便插入不会出现这样的情况。如果它们具有意外的大分区键,则会输出错误。因此,获取已存在于一个分区中的数据并将其移动到默认分区似乎相当奇怪。如果您以后要创建JUNE
分区,我不确定为什么您不会将分区拆分为MAY
和{{1分区。