PostgreSQL中的约束名称更新


91

是否可以在Postgres中更改约束名称?我添加了一个PK:

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

我想为其使用其他名称,以与系统的其余部分保持一致。我应该删除现有的PK约束并创建一个新的PK约束吗?还是有一种“软”的方式来管理它?

谢谢!

Answers:


82

对于主键,您应该能够:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

但是,这不适用于其他类型的约束。最好的选择是删除旧的并创建一个新的。确保在事务内完成此操作,因此在重建过程中没有它就无法运行系统。(如果你不能在一个事务做,一定要创建新的一个第一,之前丢弃旧的)


155

要重命名PostgreSQL 9.2或更高版本中的现有约束,可以使用ALTER TABLE

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

1
@ArturoHerrero我们可以一次对多个约束进行重命名吗?如果可以,怎么办?
艾伦(Erlan)

1
@Erlan您可以通过查询来获取所有约束的列表,通过对其pg_catalog进行迭代,LOOP然后使用动态查询进行重命名。
Evgeny Nozdrev '18

1

我们发现主键通常落后于主表名称。该脚本帮助我们确定并解决有问题的问题。

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字节)。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.