oracle 分区拆分 不能插入数据 01502 索引失效

数据表day_energy当前为月分区表,分区信息如下:DE_200912,DE_201001,DE_201002.....,月分区表出现速度查询慢,因此通过建立日分区表进行改善。

拆分月分区表的语句为:

alter table day_energy split partition de_201001 at('20100102') into (partition de_20100101,partition de_20100102)

分析:

alter table 表名 split partition 分区名 at (分割日期) into (新分区1,新分区2);

如果简单的分区1个月的表,比较简单,但是如果要拆分一年的表,那就太复杂了。为了简单实现所以就通过以下这个过程进行批量拆分:

-- czc 拆分分区表
--将月分区表拆分成日分区表
declare
  v_tbl     varchar2(56);
  v_partion varchar2(56);
  datetime  date;
  v_sql     varchar2(1024);
  v_dt0     varchar2(8);
  v_dt1     varchar2(8); 
begin
  datetime:=to_date('2010-11-1','yyyy-MM-dd');
  v_tbl:='day_energy';
  while to_char(datetime,'yyyyMMdd')!='20110101' loop
     if to_char(datetime,'MM')=to_char(datetime+1,'MM') then
       v_dt0:=to_char(datetime,'yyyyMMdd');
       v_dt1:=to_char(datetime+1,'yyyyMMdd');
       if to_number(to_char(datetime,'dd'))=1 then
        v_partion:='DE_'||to_char(datetime,'yyyyMM');
       else
        v_partion:='DE_'||to_char(datetime,'yyyyMMdd');
       end if;
       v_sql:='alter table '||v_tbl||' split partition '||v_partion||' at ('''||v_dt1||''') into (partition DE_'||v_dt0||', partition DE_'||v_dt1||');';
       dbms_output.put_line(v_sql);
       --execute immediate v_sql;
     end if;
     datetime:=datetime+1;
  end loop;
end;

 

但是出问题了,发现day_energy表进行插入或者更新时,提示索引异常 错误码01502。凡是批量拆分的表,均有如此问题。

解决方法:

删除主键后重新建立:

alter table 表名 drop  constraint 主键名;

为了防止以后再出类型问题,只需要手动执行alter语句即可。通过存储过程批量执行导致索引失效,直接执行语句便不会出问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值