为已经存在的表创建列表分区

Posted

技术标签:

【中文标题】为已经存在的表创建列表分区【英文标题】:Creating List partition to an already Existing Table 【发布时间】:2022-01-06 20:59:47 【问题描述】:

我正在尝试基于只有 Y 和 N 作为其值的列“REFRESH_FLAG_Y”创建一个列表分区,下面是用于创建分区的 Alter Table

ALTER TABLE "EDW"."LABOR_SCHEDULE_DAY_F" MODIFY
PARTITION BY LIST ("REFRESH_FLAG") 
 (PARTITION "REFRESH_FLAG_Y"  VALUES ('Y') , 
 PARTITION "REFRESH_FLAG_N"  VALUES ('N')) ;
 COMMIT;

但是每当我执行代码时,我都会收到一条错误消息 第 1 行的错误: ORA-14400: 插入的分区键未映射到任何分区

【问题讨论】:

11g 不允许对非分区表进行分区。你必须使用DBMS_REDEFINITION 【参考方案1】:

您确实使用 Oracle 11g 标签标记了问题;你真的会用吗?


这是一个 12c 的例子;如果一切正常,它工作

SQL> create table labor_schedule_day_f as
  2  select 1 id, 'Y' refresh_flag from dual union all
  3  select 2 id, 'N' refresh_flag from dual;

Table created.

SQL> alter table labor_schedule_Day_f modify
  2  partition by list (refresh_flag)
  3  (partition refresh_flag_y values ('Y'),
  4   partition refresh_flag_n values ('N')
  5  );

Table altered.

您报告的错误意味着:

SQL> drop table labor_schedule_day_f;

Table dropped.

SQL> create table labor_schedule_day_f as
  2  select 1 id, 'Y' refresh_flag from dual union all
  3  select 2 id, 'N' refresh_flag from dual;

Table created.

插入REFRESH_FLAG 既不是Y 也不是N 的行(因此它违反您指定的规则):

SQL> insert into labor_schedule_day_f values (3, 'X');

1 row created.

使用与之前相同的 ALTER TABLE 语句:

SQL> alter table labor_schedule_Day_f modify
  2  partition by list (refresh_flag)
  3  (partition refresh_flag_y values ('Y'),
  4   partition refresh_flag_n values ('N')
  5  );
alter table labor_schedule_Day_f modify
            *
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition


SQL>

看到了吗?你得到的错误,这意味着

只有 Y 和 N 作为其值

不是真的。

附:即使某些行的 refresh_flagNULL,您也会得到相同的结果。

【讨论】:

该功能可用since 12.2.0.1,准确地说,不适用于任何12c:您可以将非分区表更改为分区表。请参阅 ALTER TABLE 的新子句 modify_to_partitioned。

以上是关于为已经存在的表创建列表分区的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer 2005 将已存在大量数据的表更改为分区表

查询以查找面向列的表(append_only 表)和分区表的列表

oracle的表如何跨表空间存储

是否可以在 hive 中已分区的表上添加分桶?

oracle 11g 分区表创建(自动按年分区)

oracle添加分区表成功了但查不到这个分区表