如何在 postgres 数据库上切换两个 ID [PK]?

2023-12-29

我想更改 Postgres 上两行的 ID,以切换它们。它们已经被定义为外键,所以我不能使用第三个数字来进行切换。

如何在一个 SQL 查询或事务中执行此操作?

Example:

UPDATE mytable SET id=2 WHERE ID=1;
UPDATE mytable SET id=1 WHERE ID=2

您提到了外键,但尚不清楚是否id是外键约束的引用或引用列。

If id是引用的列你只需定义 fk 约束ON UPDATE CASCADE http://www.postgresql.org/docs/current/interactive/sql-createtable.html。然后你可以改变你的id只要你想要的。更改会级联到相关列。


If id是参考列(并且没有其他外键约束指向它),那么还有另一种更快的方法,因为PostgreSQL 9.0。您可以使用可延迟的主键或唯一键。考虑以下演示:

Note如果你想引用你就不能使用这个id with a 外键来自另一个表的约束。我引用手册here http://www.postgresql.org/docs/current/interactive/sql-createtable.html:

引用的列必须是不可延迟唯一的列 或引用表中的主键约束。

Testbed:

CREATE TEMP TABLE t
( id integer
 ,txt text
 ,CONSTRAINT t_pkey PRIMARY KEY (id) DEFERRABLE INITIALLY DEFERRED
);
INSERT INTO t VALUES
 (1, 'one')
,(2, 'two');

Update:

UPDATE t
SET    id = t_old.id
FROM   t t_old
WHERE (t.id, t_old.id) IN ((1,2), (2,1));

Result:

SELECT * FROM t; 

id | txt
---+-----
2  | one
1  | two

您还可以声明约束DEFERRABLE INITIALLY IMMEDIATE并使用SET CONSTRAINTS ... DEFERRED在同一笔交易中。

请务必阅读手册中的详细信息:

  • CREATE TABLE http://www.postgresql.org/docs/current/interactive/sql-createtable.html
  • SET CONSTRAINTS http://www.postgresql.org/docs/current/interactive/sql-set-constraints.html

甚至似乎与DEFERRABLE INITIALLY IMMEDIATE and no SET CONSTRAINTS。我发布了一个对此的疑问 https://stackoverflow.com/q/10032272/939860.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 postgres 数据库上切换两个 ID [PK]? 的相关文章

随机推荐

  • 一个简单的代码来快速检测任何信标

    我是快速编程的新手 我正在尝试开发检测信标的应用程序 但仍然无法检测到任何信标 let region CLBeaconRegion proximityUUID NSUUID UUIDString 11111111 1111 1111 111
  • Azure SDK、Trace.Information 和 WADLogsTable

    我正在使用 Azure SDK 2 5 在 NET 中编写新的云服务 我知道诊断发生了一些重大变化使用 2 5 SDK rekesae https msdn microsoft com en us library azure dn87397
  • 学习如何编写它们的示例解析器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在寻找可以研究的解析器和 或解析器生成器的源代码 以便进一步发展我在学校课程中获得的技能 您知道任何类型的值得推荐的解析器吗 您应
  • PHP 文件形式的图像

    我对 PHP 相当陌生 我需要知道如何将文件显示为图像 例如 打开http example com script php http example com script php将显示图像 我的理由是我需要把它放在src的属性 img 我希望
  • 获取 Unicode 字符中字符串的“实际”长度

    给定一个像 xe2 x9c xae 例如 可以是其他类似 or 我想找到字符打印在屏幕上时的 实际 长度 例如 len len xe2 x9c xae 两者都返回 3 但它应该是 1 你可以这样尝试 unicodedata normaliz
  • 在 Python 中编译正则表达式

    我正在阅读 Doug Hellman 的 Python 标准库示例 并发现了这一点 1 3 2 编译表达式 re 包含用于将正则表达式作为文本字符串处理的模块级函数 但更有效的是compile程序经常使用的表达式 我无法理解他对为什么会出现
  • 当单选按钮在 Jquery mobile 中处于活动状态时,单选按钮上有不同的颜色

    我有三个单选按钮 它们在 jquery 中具有相同的主题 如果我选择其中之一 按钮的颜色将更改为 css 中的 ui btn active 类中指定的颜色 我的单选按钮名为 可以见面 不确定 和 拒绝 我希望 拒绝 单选按钮在被选中时具有与
  • 将整个页面替换为 ajax 加载页面的内容

    我正在使用 JQuery 并且试图找到一种用 ajax 加载的内容替换整个页面的方法 我找到了建议如何从加载页面执行此操作的答案 但如果可能的话 我想从加载页面执行此操作 我有一个使用大量 ajax 调用的网络应用程序 问题是 如果用户在这
  • 高斯曲线拟合算法

    各位 我一直在尝试获得一些数据集的高斯拟合 这些数据集在某种程度上看起来像扭曲的正态分布 我一直在使用软件来做到这一点 我想知道是否可以应用迭代算法将这些数据集转换为高斯拟合曲线 原始曲线的标准差和平均值作为输入 有任何想法吗 计算数据的平
  • 查找未设置该属性的Neo4j节点

    使用Cypher 如何找到不存在属性的节点 例如我有两个节点 A foo true name A B name B 现在我想找B 在没有的基础上选择它foo属性集 我怎样才能做到这一点 正如迈克尔 饥饿提到的 MATCH n WHERE N
  • HTTP 中的“406-不可接受的响应”是什么?

    在我的 Ruby on Rails 应用程序中 我尝试通过 POSTMAN 上传图像REST http en wikipedia org wiki Representational State Transfer客户在Base64 http
  • 为什么在 docker 中拉取镜像时出现此错误

    我尝试使用以下方法提取图像 docker pull ghcr io linuxserver nextcloud latest 但我收到此错误消息 来自守护进程的错误响应 获取 https ghcr io v2 拨打 tcp 在 1 53 上
  • 将条纹样式添加到项目列表

    使用 KnockoutJS 对列表进行条带化的最佳方法是什么 下面的 div 上的类应该是偶数或奇数 具体取决于它在列表中的位置 并在添加或删除项目时更新 div class Headlines loader div
  • Xamarin 的 Genymotion Android 模拟器

    我在使用 Genymotion Android 模拟器进行 xamarin 开发时遇到问题 我已经安装了 Genymotion 桌面应用程序和其中的几个 Android 设备 每当我通过 Genymotion 桌面应用程序运行任何已安装的设
  • 原型混乱:父原型属性受子原型影响

    我正在读一本关于 OOP javascript 的书 并被其中一个示例困住了 在示例代码的第一个版本中 一个新实例Shape构造函数被创建并且toString方法被调用 这toString方法返回 三角形 这是name的财产Triangle
  • 为什么 write.csv 和 read.csv 不一致? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Android 中手动重新排序 ListView?

    我在 Android 中有一个 ListView 需要能够手动重新排序 Android 的音乐播放器应用程序就是一个示例 您可以更改播放列表中曲目的顺序 我知道如何以编程方式更改 ListView 的顺序 但不知道如何在音乐播放器应用程序中
  • 如何发送PDF文件到前端?

    我的系统上有一个保存的 PDF 文件 我正在尝试使用 node express 将文件发送到前端 我正在将文件作为流 二进制字符串 发送到前端 但是当在前端运行一些代码以将 PDF 下载到用户计算机上时 PDF 文件显示为空白 这是我在服务
  • 在 Spark 中对多个 DataFrame 执行 join

    我有 3 个由 3 个不同进程生成的数据帧 每个数据框都有相同名称的列 我的数据框看起来像这样 id val1 val2 val3 val4 1 null null null null 2 A2 A21 A31 A41 id val1 va
  • 如何在 postgres 数据库上切换两个 ID [PK]?

    我想更改 Postgres 上两行的 ID 以切换它们 它们已经被定义为外键 所以我不能使用第三个数字来进行切换 如何在一个 SQL 查询或事务中执行此操作 Example UPDATE mytable SET id 2 WHERE ID