是否可以将主键设置为 DEFERRABLE?
Posted
技术标签:
【中文标题】是否可以将主键设置为 DEFERRABLE?【英文标题】:Is it possible to set a primary key to DEFERRABLE? 【发布时间】:2017-03-30 15:39:22 【问题描述】:我的问题与this question 有关。 我想切换定义为主键的表的两个 id。
但不幸的是,我要切换 ids 的表已经创建,并且没有设置主键约束 do deferrable
。
我尝试使用以下语句将其设置为可延迟:
alter table table_name alter constraint primary_key_name_pkey deferrable;
得到一个错误:
constraint "primary_key_name_pkey" of relation "table_name" is not a foreign key constraint
有没有办法在创建后将主键约束设置为可延迟?
感谢您的帮助。
【问题讨论】:
我认为您需要在创建 PK 时将其删除并重新创建,并将其标记为可延迟。 对于一对行,可能的解决方法可能是通过临时值交换。 (这可能会影响触发器等,但无论如何更改 PK 值都是可疑的......) 如果有外键约束引用它,您似乎无法推迟 PK。我的解决方法是一个小的 python 脚本,它删除了所有外键约束和 PK 本身,进行了 id 的 id 交换,然后再次恢复了所有约束。 【参考方案1】:PostgreSQL 源码中写的:
/*
* ALTER TABLE ALTER CONSTRAINT
*
* Update the attributes of a constraint.
*
* Currently only works for Foreign Key constraints.
* Foreign keys do not inherit, so we purposely ignore the
* recursion bit here, but we keep the API the same for when
* other constraint types are supported.
来源:https://github.com/postgres/postgres/blob/master/src/backend/commands/tablecmds.c#L9557
所以,即使是 Pg12,也不可能。
【讨论】:
以上是关于是否可以将主键设置为 DEFERRABLE?的主要内容,如果未能解决你的问题,请参考以下文章