首页 > 解决方案 > 如何解决 ORA-54019:虚拟列表达式不能更改,因为它是一个分区列?

问题描述

我有一个由虚拟列分区的表,我想更改该虚拟列的行为,但显然这不可能按照我尝试的方式进行。

ALTER TABLE MY_TABLE
MODIFY VIRTUAL_COLUMN 
GENERATED ALWAYS AS (TO_DATE(SUBSTR(SOME_COLUMN, 4, 8), 'yyyy-mm-dd'))

如何更改该虚拟列?

标签: sqloracle

解决方案


如果虚拟列构成分区键的一部分,则不能更改其定义。

如果要更改此设置以便还可以更改分区方案,则需要:

  • 使用您想要的表达式添加一个新的虚拟列
  • 更改分区方案以使用新的虚拟列

如果您使用的是 18c 或更高版本,则可以使用以下命令执行此操作alter table

create table t (
  c1 date,
  v1 number as (
    to_number ( to_char ( c1, 'yyyymmdd' ) )
  )
) partition by range ( v1 ) (
  partition p0 values less than ( 20200101 )
);

alter table t
  modify v1 number as (
    to_number ( to_char ( c1, 'yyyymm' ) )
  );

ORA-54019: Virtual column expression cannot be changed because it is a partitioning column
  
alter table t
  add v2 number as (
    to_number ( to_char ( c1, 'yyyymm' ) )
  );
  
alter table t
  modify partition by range ( v2 ) (
    partition p0 values less than ( 202001 )
  ) online;

select column_name 
from   user_part_key_columns
where  name = 'T';

COLUMN_NAME   
V2   

对于旧版本,您需要使用DBMS_redefinition来最大限度地减少停机时间。


推荐阅读