簡體   English   中英

手動增加數據庫中的值

[英]Manually increment values in database

我有一個表結構

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行。 請幫我在這里。

如果是預定操作,例如每天一次,則可以保留該有序列。 如果沒有擺脫它,並在查詢中執行它:

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

這樣可以節省維護該列的麻煩,並且在某些情況下可以提供更好的性能,例如並發寫入,因為受影響的行較少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM