手动增加数据库中的值

本文关键字:数据库 增加数 增加 | 更新日期: 2023-09-27 18:17:07

我有一个表结构

<>之前Id | col1 | col21 | 1 | val12 | 2 | val23 | 3 | val3——4 | 4 | val45 | 5 | val16 | 6 | val6之前

我想执行一个删除操作来删除其中一行(比如id=3),这样我的数据就会变成这样:

<>之前Id | col1 | col21 | 1 | val12 | 2 | val24 | 4 | val45 | 5 | val16 | 6 | val6之前

但是我想让它变成

<>之前Id | col1 | col21 | 1 | val12 | 2 | val24 | 3 | val45 | 4 | val16 | 5 | val6之前

我希望我的col1总是在序列中,而不考虑其他列。有什么建议吗?它可以在一个更新查询中完成吗?我使用POSTGRESQL作为我的数据库,并使用c#进行编码。我有大约1000行在数据库中。

手动增加数据库中的值

如果它是一个计划操作,比如每天一次,那么您可以保留该有序列。如果没有,则在查询中删除它:

select
    id,
    row_number() over(order by id) col1,
    col2
from t

如果它是一个选项,您可以使用触发器自动执行此操作。比如:

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,这更相关)

您真的需要在表中使用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

这可以为维护该列节省很多麻烦,并且在某些情况下可以提供更好的性能,例如并发写,因为受影响的行更少。