为已经存在的表创建列表分区
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_flag
是 NULL
,您也会得到相同的结果。
【讨论】:
该功能可用since 12.2.0.1,准确地说,不适用于任何12c:您可以将非分区表更改为分区表。请参阅 ALTER TABLE 的新子句 modify_to_partitioned。以上是关于为已经存在的表创建列表分区的主要内容,如果未能解决你的问题,请参考以下文章
SqlServer 2005 将已存在大量数据的表更改为分区表