首页 > 解决方案 > 如何重命名系统生成的约束名称和主键索引

问题描述

正如标题所说,我需要重命名一个名为 sys_ 000545 的主键约束,并且索引名称具有相同的名称。如何在 oracle pl/sql 中实现这一点。名字是随机的。

我尝试将 alter index 与选择索引名称的子查询一起使用,但 oracle 不允许这样做。

编辑我需要这个重命名作为更新脚本的一部分

标签: sqloracle12c

解决方案


SQL> create table test (id number primary key);

Table created.

SQL> select constraint_name from user_constraints where table_name = 'TEST';

CONSTRAINT_NAME
------------------------------
SYS_C009641

SQL> alter table test rename constraint sys_c009641 to pk_test;

Table altered.

SQL> select constraint_name from user_constraints where table_name = 'TEST';

CONSTRAINT_NAME
------------------------------
PK_TEST

SQL>

SQL> select index_name from user_indexes where table_name = 'TEST';

INDEX_NAME
------------------------------
SYS_C009641

SQL> alter index sys_c009641 rename to pk_test;

Index altered.

SQL> select index_name from user_indexes where table_name = 'TEST';

INDEX_NAME
------------------------------
PK_TEST

SQL>

[编辑:脚本需要动态 SQL]

SQL> drop table test;

Table dropped.

SQL> create table test (id number primary key);

Table created.

SQL> select constraint_name from user_constraints where table_name = 'TEST';

CONSTRAINT_NAME
------------------------------
SYS_C009643

SQL> declare
  2    l_table_name user_tables.table_name%type := 'TEST';
  3    l_pk user_constraints.constraint_name%type;
  4  begin
  5    select constraint_name
  6      into l_pk
  7      from user_constraints
  8      where table_name = l_table_name
  9        and constraint_type = 'P';
 10
 11    execute immediate 'alter table ' || l_table_name || ' rename constraint ' ||
 12                      l_pk || ' to pk_' || l_table_name;
 13  end;
 14  /

PL/SQL procedure successfully completed.

SQL> select constraint_name from user_constraints where table_name = 'TEST';

CONSTRAINT_NAME
------------------------------
PK_TEST

SQL>

推荐阅读