【发布时间】:2016-09-21 23:06:08
【问题描述】:
我想重命名许多具有以“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 (....)
问题是我不知道约束的名称,它们有一个默认名称,我只知道它们所在的表。
有可能吗?
【问题讨论】:
-
我觉得你运气不好。有
alter table xyz drop|enable|disable primary key,但是rename不支持语法。 -
如果你知道约束列,你可以删除并重新创建它 - 如果你
ALTER TABLE SPECIALITE DROP PRIMARY KEY KEEP INDEX;那么你可以添加一个新的 PK 而不必重建索引,尽管这将保留旧系统- 生成的名称。但是,如果您不这样做 - 并且因为您要重命名许多您可能不这样做 - 那么您无论如何都必须动态找到它们,所以您现在拥有的会更简单。 -
为什么不使用 user_cons_columns ,它有表名、约束名和其他相关信息。
-
ALTER TABLE SPECIALITE RENAME CONSTRAINT SYS_C002786098 TO PK_SPECIALITE是命令。您需要知道要重命名的约束的名称。您可以从USER_CONSTRAINTS获取您拥有的表的约束名称。即——你的脚本很好。 -
@WilliamRobertson - 不走运;语法是
alter table rename constraint ....,它适用于主键和所有其他可以命名的约束。 (not null约束无法命名,但这是有道理的 - 您不能引用not null约束。)