我有一个表结构
id | col1 | col2 1 | 1 | val1 2 | 2 | val2 3 | 3 | val3 -- 4 | 4 | val4 5 | 5 | val1 6 | 6 | val6
我想执行删除操作来删除其中一行(比如id = 3),这样我的数据就会变成:
id | col1 | col2 1 | 1 | val1 2 | 2 | val2 4 | 4 | val4 5 | 5 | val1 6 | 6 | val6
但我希望它像
id | col1 | col2 1 | 1 | val1 2 | 2 | val2 4 | 3 | val4 5 | 4 | val1 6 | 5 | val6
我希望我的col1始终按顺序排列,而不管其他列。 关于如何去做的任何建议。可以仅在一个更新查询中完成。我使用POSTGRESQL作为我的数据库并使用C#进行编码。我在数据库中有大约1000行。 请帮帮我。
答案 0 :(得分:2)
如果是预定的操作,比如说每天一次,那么您可以保留该有序列。如果没有摆脱它并在查询中执行:
select
id,
row_number() over(order by id) col1,
col2
from t
答案 1 :(得分:0)
如果是一个选项,您可以使用触发器自动执行此操作。类似的东西:
create or replace function maintain_sort_idx() returns trigger as $$
begin
update yourtable
set col1 = col1 - 1
where col1 > old.col1;
return null;
end;
$$ language plpgsql;
create trigger maintain_sort_idx after delete on yourtable
for each row execute procedure maintain_sort_idx();
请注意,它不是防弹,例如如果同时删除多行,它可能会或可能不会按预期工作。为了使其成为防弹,您需要修改更新查询,以便根据您用于维护排序列的任何适当条件设置col1 = row_number() over (...) where col1 <> row_number() over (...)
。 (你的示例数据会建议id,但我假设你有一个单独的列,例如parent_id更相关。)
答案 2 :(得分:0)
你真的需要你桌上的col1吗?如果不是(例如,你保持你的id列的排序),那么你可以在查询中使用rank()函数来返回动态计算的顺序排序。用表:
id | col2
1 | val1
2 | val2
4 | val4
5 | val5
6 | val6
此查询:
select id, rank() over (order by id), col2 from test
返回
id | col1 | col2
1 | 1 | val1
2 | 2 | val2
4 | 3 | val4
5 | 4 | val5
6 | 5 | val6
这可以为您在维护该列时节省大量麻烦,并且在某些情况下可以提供更好的性能,例如并发写入,因为更少的行受到影响。