我想重命名具有默认名称(以'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)
问题是我不知道约束的名称,它们有一个默认名称,我只知道它们所在的表。
可能吗?
如您所知,您需要运行两个查询。
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语句中使用。
| 归档时间: |
|
| 查看次数: |
9018 次 |
| 最近记录: |