PostgreSQL中的约束名更新

137

在Postgres中是否可以更改约束名? 我的PK是通过以下方式添加的:

ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);

我想给它取一个不同的名称,以便与系统的其余部分保持一致。

是应该删除现有的PK约束并创建一个新的约束吗?还是有一种“软件”方式来管理它?

谢谢!

4个回答

232

如果您使用的是PostgreSQL 9.2或更新版本,想要重命名一个已存在的约束条件,可以使用ALTER TABLE命令:

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

1
@ArturoHerrero,我们能同时重命名多个约束吗?如果可以,怎么做? - Erlan
2
@Erlan,您可以通过查询pg_catalog获取所有约束的列表,通过LOOP迭代它,并使用动态查询进行重命名。 - Evgeny Nozdrev

103

对于主键,您应该只需要:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

但对于其他类型的约束条件而言,这种方法是行不通的。 最好的选择是删除旧的约束条件并创建一个新的。确保在事务内执行此操作,以便在重建期间系统不会失去约束条件。(如果不能在事务内执行此操作,请务必先创建新的约束条件,然后再删除旧的)


7
我们发现主键常常落后于主表名称。这个脚本帮助我们识别和修复了出现问题的主键。

select 
    table_name, 
    constraint_name , 
    'ALTER TABLE ' || table_name || ' RENAME CONSTRAINT ' || constraint_name || ' TO ' || left(table_name, 58) || '_pkey;'
from information_schema.table_constraints tc
where constraint_type  = 'PRIMARY KEY' 
and constraint_name <> left(table_name, 58) || '_pkey';

这将查找所有主键名称不再是“default”模式(<tablename>_pkey)的表,并为每个表创建一个重命名脚本。

上面代码中的58字符限制是为了考虑约束名称的最大大小(63字节)。

在运行之前,请显然地检查返回的内容。希望对其他人有所帮助。


1
我们在尝试以这种格式运行命令时遇到了42704错误。
ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

原来我们现有的约束以"FK_"开头,即一个大写前缀。
在这种情况下,我们必须用双引号括起来约束名称,即:
ALTER TABLE name RENAME CONSTRAINT "FK_constraint_name" TO "FK_new_constraint_name";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接