我想更改 Postgres 上两行的 ID,以切换它们。它们已经被定义为外键,所以我不能使用第三个数字来进行切换。
如何在一个 SQL 查询或事务中执行此操作?
例子:
UPDATE mytable SET id=2 WHERE ID=1;
UPDATE mytable SET id=1 WHERE ID=2
Run Code Online (Sandbox Code Playgroud)
您提到了外键,但仍不清楚id是外键约束的引用列还是引用列。
如果id是引用的列,您只需定义 fk 约束ON UPDATE CASCADE。然后你就可以id随心所欲地改变你的。更改会级联到相关列。
如果id是引用列(并且没有其他外键约束指向它),那么自PostgreSQL 9.0以来还有另一种更快的方法。您可以使用可延迟的主键或唯一键。考虑以下演示:
请注意,如果您想引用另一个表中的外键id约束,则不能使用此选项。我在这里引用手册:
引用的列必须是引用表中不可延迟的唯一或主键约束的列。
测试台:
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');
Run Code Online (Sandbox Code Playgroud)
更新:
UPDATE t
SET id = t_old.id
FROM t t_old
WHERE (t.id, t_old.id) IN ((1,2), (2,1));
Run Code Online (Sandbox Code Playgroud)
结果:
SELECT * FROM t;
id | txt
---+-----
2 | one
1 | two
Run Code Online (Sandbox Code Playgroud)
您还可以声明约束DEFERRABLE INITIALLY IMMEDIATE并SET CONSTRAINTS ... DEFERRED在同一事务中使用。
请务必阅读手册中的详细信息:
甚至似乎可以与DEFERRABLE INITIALLY IMMEDIATE和 no 一起使用SET CONSTRAINTS。我对此提出了一个问题。
| 归档时间: |
|
| 查看次数: |
4514 次 |
| 最近记录: |