是否可以将主键设置为 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?的主要内容,如果未能解决你的问题,请参考以下文章

mysql创建数据库时怎么将主键设置为UUID,建表语句怎么写

为啥我将主键设置为文本(字符串)时无法检索数据

为啥当我尝试将主键设置为无符号时出现 errno150

将主键更改为自动递增

Rails迁移以将主键添加到现有表

EF6 vs Entity Framework Core:插入实体而不将主键(身份)重置为零