如何在Oracle上重命名默认约束?

时间:2016-09-21 14:19:00

标签: sql oracle plsql

我想重命名许多具有以'SYS'开头的默认名称的约束(PK,FK,...等),以便能够在其他数据库中插入相同的数据。

我找到了以下脚本,我更改了以获得我想要的内容:

BEGIN
    FOR cn IN (
        SELECT constraint_name 
        FROM user_constraints 
        WHERE constraint_type = 'P'
        AND table_name = 'SPECIALITE'
    )
    LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE ' || cn.table_name || ' RENAME CONSTRAINT ' || cn.constraint_name  || ' TO PK_' || 'SPECIALITE';
    END LOOP;
END;

这个脚本有效,但对我来说似乎有点复杂,我想知道它是否存在类似:

ALTER TABLE 'SPECIALITE' RENAME CONSTRANT (....)

问题是我不知道约束的名称,它们有一个默认名称,我只知道它们所在的表。

有可能吗?

3 个答案:

答案 0 :(得分:5)

如您所知,您需要运行两个查询。

select constraint_name from user_constraints 
where table_name = <table_name> and constraint_type = 'P';

并且手头有约束名称,

alter table <table_name> rename constraint <old_constr_name> to <new_constr_name>;

这将需要从第一个查询中复制约束名称并将其粘贴到第二个查询中的适当位置(<old_constr_name>)。

如果这就是全部,我不会发布答案。但是我记得我前一段时间在AskTom上读过的东西 - 一种使用SQL * Plus中的COLUMN命令避免复制和粘贴的聪明方法。 (这也可以在SQL Developer和Toad中使用。)像这样:

column constraint_name new_val c   -- Note: no semicolon - this is SQL*Plus, not SQL

select constraint_name from user_constraints 
where table_name = <table_name> and constraint_type = 'P';

alter table <table_name> rename constraint &c to <new_constr_name>;

如果您需要更改许多PK约束名称,这将节省一些工作。 SELECT查询返回的约束名称保存在&#34; new_val&#34;标记为&#34; c&#34;从SQL * Plus COLUMN命令,它在ALTER TABLE语句中使用。

答案 1 :(得分:0)

如果您没有约束名称,则无法直接执行此操作。但您可以轻松生成声明。

select 'ALTER TABLE ' || table_name || ' RENAME CONSTRAINT ' || constraint_name || ' TO PK_' || upper( table_name )
from user_constraints
where constraint_type = 'P'
and generated = 'GENERATED NAME';

此选择将列出所有对其主键开始的表格,该表格以&#39; SYS&#39;开头,并将其重命名为PK_TABLE_NAME;

您只需检查所有语句是否适合您并运行它们。

您也可以像这样使用生成的列

scaleValue

但你会有BIN表和其他不需要的表

答案 2 :(得分:0)

user_cons_columns视图添加到SQL中,以便生成约束名称。这是一个快速而肮脏的例子:

select 'ALTER TABLE ' || c.table_name || ' RENAME CONSTRAINT ' || c.constraint_name  || ' TO ' || substr(c.constraint_type || '_' || c.table_name || '_' || replace(wm_concat(cc.column_name), ',', '_'), 0, 30) || ';'
from user_constraints c
join user_cons_columns cc on c.table_name = cc.table_name and c.constraint_name = cc.constraint_name
where c.constraint_name like 'SYS%'
group by c.table_name, c.constraint_name, c.constraint_type;

此SQL使用以下命令生成可执行脚本:

ALTER TABLE TABLENAME RENAME CONSTRAINT SYS_xxxxxx TO C_TABLENAME_COLUMN;

请注意我使用的是无证件的wm_concat功能。如果您使用的是Oracle&gt; = 11g,请考虑使用listagg