如何重命名Oracle的默认约束?

Chi*_*ski 3 sql oracle plsql

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

我发现以下脚本已更改为我想要的:

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;
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE 'SPECIALITE' RENAME CONSTRANT (....)
Run Code Online (Sandbox Code Playgroud)

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

可能吗?

mat*_*guy 5

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

select constraint_name from user_constraints 
where table_name = <table_name> and constraint_type = 'P';
Run Code Online (Sandbox Code Playgroud)

并带有约束名称,

alter table <table_name> rename constraint <old_constr_name> to <new_constr_name>;
Run Code Online (Sandbox Code Playgroud)

这将需要从第一个查询中复制约束名称,并将其粘贴到第二个查询中的适当位置(<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>;
Run Code Online (Sandbox Code Playgroud)

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