在Postgres中是否可以更改约束名? 我的PK是通过以下方式添加的:
ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);
我想给它取一个不同的名称,以便与系统的其余部分保持一致。
是应该删除现有的PK约束并创建一个新的约束吗?还是有一种“软件”方式来管理它?
谢谢!
在Postgres中是否可以更改约束名? 我的PK是通过以下方式添加的:
ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);
我想给它取一个不同的名称,以便与系统的其余部分保持一致。
是应该删除现有的PK约束并创建一个新的约束吗?还是有一种“软件”方式来管理它?
谢谢!
如果您使用的是PostgreSQL 9.2或更新版本,想要重命名一个已存在的约束条件,可以使用ALTER TABLE命令:
ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;
对于主键,您应该只需要:
ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_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';
这将查找所有主键名称不再是“default”模式(<tablename>_pkey
)的表,并为每个表创建一个重命名脚本。
上面代码中的58字符限制是为了考虑约束名称的最大大小(63字节)。
在运行之前,请显然地检查返回的内容。希望对其他人有所帮助。
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";
pg_catalog
获取所有约束的列表,通过LOOP
迭代它,并使用动态查询进行重命名。 - Evgeny Nozdrev