我想更改 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/