ALTER TABLE…RENAME PARTITION

ALTER TABLE ... RENAME PARTITION/SUBPARTITION 用于重命名分区或子分区,此操作仅修改元数据,但会使依赖旧名称的脚本失效,执行前需确认新名称唯一并排查代码依赖。

语法介绍

ALTER TABLE table_name RENAME PARTITION old_name TO new_name;

ALTER TABLE table_name RENAME SUBPARTITION old_name TO new_name;

参数说明

参数名称

参数要求

参数说明

参数示例

table_name

必填

目标分区表的名称。

customer_data

old_name

必填

要重命名现有分区或子分区的名称。

sp_asia

new_name

必填

为分区或子分区指定的新名称。

sp_2023_asia

注意事项

  • 执行此命令的用户需是该表的所有者,或拥有对该表的ALTER权限。

  • MOVE PARTITION会获取目标分区的AccessExclusiveLock锁,在锁持有期间,所有对该分区的DDLDML操作将被阻塞,建议在业务低峰期执行。

  • 新分区/子分区名称在表内必须唯一,不能与现有分区或子分区名称冲突。

  • 此命令是DDL操作,执行后自动提交,无法回滚。如需撤销,需要再次执行RENAME操作将名称改回。

  • 如果应用程序代码、存储过程或视图中硬编码了旧的分区名,重命名后将导致这些对象执行失败。执行重命名之前,建议进行全面的影响分析并同步更新所有依赖对象。

使用示例

本示例演示如何将一个复合分区表 customer_data 中的子分区 sp_asia 重命名为 sp_2023_asia,以符合按年份和地区命名的规范。

环境准备

本步骤将创建一个 RANGE-LIST 复合分区表 customer_data 并插入数据。

-- 创建复合分区表
CREATE TABLE customer_data (
    customer_id INT, region VARCHAR2(20), reg_date DATE
)
PARTITION BY RANGE (reg_date)
SUBPARTITION BY LIST (region) (
    PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')) (
        SUBPARTITION sp_asia VALUES ('Asia'),
        SUBPARTITION sp_2023_europe VALUES ('Europe')
    )
);

前置检查

检查待重命名的子分区是否存在。

-- 确认旧子分区 sp_asia 存在
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'CUSTOMER_DATA';

执行操作

执行 RENAME SUBPARTITION 命令,将子分区 sp_asia 重命名为 sp_2023_asia

ALTER TABLE customer_data RENAME SUBPARTITION sp_asia TO sp_2023_asia;

结果验证

验证子分区名称已更新。

-- 结构验证:确认子分区名称已更新
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'CUSTOMER_DATA';
-- 查询结果中应包含 sp_2023_asia,不包含 sp_asia

常见问题

Q1:执行时报错 ORA-14078: partition name is already in use
这是因为您指定的新名称 new_name 已经被该表中的另一个分区或子分区使用,需要更换一个在表内唯一的名称。

Q2:执行时报错 ORA-14076: partition name must be specified
这是因为您指定的旧名称 old_name 不存在,请通过前置检查核对正确的名称。

Q3:重命名分区后,之前引用该分区的程序或脚本无法工作了,为什么?
这是因为程序或脚本中硬编码了旧的分区名称,重命名后需要同步修改所有显式引用旧名称的代码,将其更新为新名称。

相关语句