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

标签 sql postgresql

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

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

例子:

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

最佳答案

您提到外键,但仍不清楚 id是外键约束的引用列。

如果 id是被引用的列 你刚刚定义了 fk 约束 ON UPDATE CASCADE .然后你可以改变你的id随心所欲。更改会级联到相关列。


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

请注意,如果您想引用 id,则不能使用它使用来自另一个表的外键 约束。我引用手册 here :

The referenced columns must be the columns of a non-deferrable unique or primary key constraint in the referenced table.

测试台:

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 t
SET    id = t_old.id
FROM   t t_old
WHERE (t.id, t_old.id) IN ((1,2), (2,1));

结果:

SELECT * FROM t; 

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

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

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


Even 似乎适用于 DEFERRABLE INITIALLY IMMEDIATE没有 SET CONSTRAINTS .我发布了 question about that .

关于sql - 如何在 postgres 数据库上切换两个 ID [PK]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10029691/

相关文章:

SQL 列求和 - 在对列求和之前使用 if 语句将行值加倍

sql - 选择 1 个表中的所有列表与另一个表中的列表匹配的位置

sql - 在此上下文中不允许使用子查询。只允许使用标量表达式

c# - 如何将 NpgsqlCopyIn 与 NpgsqlCopySerializer 一起使用?

postgresql - 升级到 Ubuntu 18.04 后 Gitlab 无法启动

sql - 连接列而不包括具有空值的列?

MySQL:使用 Group By 更新字段

python - 属性错误 : module 'django.db.models' has no attribute 'MultiPolygonField'

ruby-on-rails - Rails - Heroku - Postgres - 不以明文形式存储敏感内容

postgresql - 你如何运行 ActiveRecord `find_each` 到 postgres 中的物化 View