[英]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.