小编Ped*_*ges的帖子

如何在postgres中的记录之间交换主键

我似乎无法找到一种方法来实现这一点(或不)

我需要实现的是非标准的,因此我很难找到解决方案。

我需要编写一个数据迁移工具来将旧记录与表中的新记录“交换”,但我有以下要求/约束​​:

  • 不要丢失旧记录
  • 使对旧记录的所有引用都指向新记录(这不仅仅是 db 外键,它是我无法控制的外部服务、缓存、电子邮件、历史数据、书签等的引用)
  • 迁移代码需要与模式无关,即如果新列添加到表中并且独立于其他表引用它,则不需要更新。
  • 我无法锁定表超过更新两条记录所需的时间。

所以我的理想解决方案是,蛮力交换他们的主键......

问题是如何在 postgresql 中的两条记录之间交换主键。我很难找到一种不会因重复键异常而失败的方法,即一种以事务方式运行更新“验证”的方法。

我试过了

UPDATE table
SET id = (CASE id WHEN 1 THEN 2 WHEN 2 THEN 1 ELSE id END)
Run Code Online (Sandbox Code Playgroud)
UPDATE table
SET id = CASE id WHEN 1 THEN 2 WHEN 2 THEN 1 END
WHERE id IN (1, 2);
Run Code Online (Sandbox Code Playgroud)

都在重复键约束上失败

我正在使用 PostgreSQL 11.6


解决了

数字主键的批量更新解决方案,感谢以下好人的输入:

-- disable foreign key constraint validation
BEGIN;
SET session_replication_role='replica';

-- update the pairs of ids to their negative counterparts
WITH query …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-11

7
推荐指数
3
解决办法
1549
查看次数

标签 统计

postgresql ×1

postgresql-11 ×1