PostgreSQL 中的约束名称更新

是否可以在 Postgres 更改约束名称? 我有一个 PK 加上:

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

我想给它取个不同的名字,以便与系统的其他部分保持一致。 我应该删除现有的 PK 约束并创建一个新的约束吗? 还是有一个“软”的方法来 管理它?

谢谢!

66614 次浏览

对于主键,只需要:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

但是,这对其他类型的约束不起作用。最好的选择是删除旧的,创建一个新的。一定要在事务中执行此操作,这样在重新构建期间,系统就不能没有它。(如果不能在事务中执行,请确保在删除旧事务之前创建新的 第一)

To rename an existing constraint in PostgreSQL 9.2 or newer, you can use ALTER TABLE:

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

我们发现主键通常滞后于主表名。这个脚本帮助我们识别并修复有问题的脚本。

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';

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

上面代码中的58个字符限制用于说明约束名称的最大大小(63字节)。

Obviously sense check what is returned prior to running it. Hope that is helpful for others.