【问题标题】:Manually increment values in database手动增加数据库中的值
【发布时间】:2013-06-02 09:49:18
【问题描述】:

我有一个表结构

编号 | col1 | col2 1 | 1 | val1 2 | 2 | val2 3 | 3 | val3 -- 4 | 4 | val4 5 | 5 | val1 6 | 6 | val6

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

编号 | col1 | col2 1 | 1 | val1 2 | 2 | val2 4 | 4 | val4 5 | 5 | val1 6 | 6 | val6

但我希望它像

编号 | col1 | col2 1 | 1 | val1 2 | 2 | val2 4 | 3 | val4 5 | 4 | val1 6 | 5 | val6

我希望我的 col1 始终按顺序排列,而与其他列无关。 关于如何去做的任何建议。只能在一个更新查询中完成吗?我使用 POSTGRESQL 作为我的数据库并使用 C# 进行编码。我在数据库中有大约 1000 行。 请帮帮我。

【问题讨论】:

  • 我们可以看看你到目前为止尝试了什么吗?
  • 不熟悉postgresql,但一般update table set col1 = col1 - 1 where col1 > @col1_value_deleted应该可以工作。
  • 我不知道您要做什么,但是,您可以创建一个临时表并通过 select 将值插入一行。尝试考虑您执行的每个删除运行更新以更正顺序?现在您的数据库有 1000 行,但是,考虑到 10,000、1,000,0000。太疯狂了……
  • 表格的全部意义在于将一组值保持在一起,通常是因为它们代表一个单一的实体。您是否需要存储col1 的值?如果您不这样做,请考虑使用一个视图(或简单查询)来即时计算 col1 的连续值序列。

标签: c# sql postgresql


【解决方案1】:

如果是计划操作,例如每天一次,那么您可以保留该有序列。如果不摆脱它并在查询中执行:

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

【讨论】:

    【解决方案2】:

    如果可以选择,您可以使用触发器自动执行此操作。比如:

    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。)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多