sql - 如何解决 ORA-54019:虚拟列表达式不能更改,因为它是一个分区列?
问题描述
我有一个由虚拟列分区的表,我想更改该虚拟列的行为,但显然这不可能按照我尝试的方式进行。
ALTER TABLE MY_TABLE
MODIFY VIRTUAL_COLUMN
GENERATED ALWAYS AS (TO_DATE(SUBSTR(SOME_COLUMN, 4, 8), 'yyyy-mm-dd'))
如何更改该虚拟列?
解决方案
如果虚拟列构成分区键的一部分,则不能更改其定义。
如果要更改此设置以便还可以更改分区方案,则需要:
- 使用您想要的表达式添加一个新的虚拟列
- 更改分区方案以使用新的虚拟列
如果您使用的是 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来最大限度地减少停机时间。
推荐阅读
- python - 除某些情况外,按句点拆分文本
- javascript - 在 Nuxt 中使用Sharp包的问题
- javascript - “未捕获的 ReferenceError:未定义窗口”p5.js 网络工作者
- html - 在导航链接 HTML/CSS 之间创建空间
- django - 是否可以访问由 ForeignKey Django 连接的不同表的值
- javascript - Javascript animate 方法累积问题
- git - 如何将 VSCodium 设置为 git difftool
- java - 如何在不关闭项目列表的情况下单击 JMenuBar 项目?
- php - 如何排序json数组导致codeigniter 4
- regex - 使用 gnu sed 插入带有许多换行符的文本