gpt4 book ai didi

database - 根据一行中的更改更新多行

转载 作者:搜寻专家 更新时间:2023-10-30 20:55:05 25 4
gpt4 key购买 nike

我正在使用 PostgreSQL,假设我有一个任务表来跟踪任务项。任务表如下;

Id    Name      Index
7 name A 1
5 name B 2
6 name C 3
3 name D 4

任务表中的索引列存储任务的排序顺序。因此,我将按升序输出与索引相关的任务。

所以当我将任务 D(id = 3) 的索引更改为 2 时,新索引应如下所示;

Id    Name      Index
7 name A 1
5 name B 3
6 name C 4
3 name D 2

或者当我将任务 A(id = 7) 的索引更改为 4 时,新索引应如下所示;

Id    Name      Index
7 name A 4
5 name B 2
6 name C 3
3 name D 1

我认为一个一个地更新所有行的索引值是非常低效的。

那么当我更改 Tasks 表中的一个索引时,更新所有索引值的最有效方法是什么?

Edit : 

首先对造成的困惑表示抱歉。我要问的不是简单的交换两行索引。如果您查看示例,当我将任务 D 的索引更改为 2 时,不止一行发生了变化。因此,当任务 D 为 2 时,任务 B 变为 3,任务 C 变为 4。

例如;

这就像当您将任务 D 拖放到任务 A 下方时,它的索引变为 2,而 B 和 C 的索引增加 1。

最佳答案

SQL Fiddle

你正在做的是交换两行的索引。所以需要将第一个更新的索引值存储在一个临时变量中,并临时设置为一个特殊的值,以避免唯一索引冲突,即如果索引是唯一的。如果索引不是唯一的,则不需要该步骤。

begin;
create temp table t as
select
(
select index
from tasks
where id = 3
) as index,
(
select id
from tasks
where index = 2
) as id
;

update tasks
set index = -1
where id = (select id from t)
;
update tasks
set index = 2
where id = 3
;
update tasks
set index = (select index from t)
where id = (select id from t)
;
drop table t;
commit;

关于database - 根据一行中的更改更新多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25320860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com