如何實現資料在表內部置頂

2022-02-04 13:07:42 字數 2232 閱讀 3897

先考慮按sortid降序排列的情況。初始狀態sortid=id

方案1,首先獲取當前最大的sortid,例如:@maxsid = 100

其次,將要置頂的行重新公升序排列放入表變數裡,並新增一列序號列

select row_number() over(order

by sortid) as nid,id,sortid

from t_test

where id in(11,22,33,44)

order

by sortid

結果:nid

idsortid111

1122222333

3344444

然後,計算出新的sortid=@maxsid+nid

declare

@ttable(nid int,id int)

insert

into

@tselect row_number() over(order

by sortid) as nid,id

from t_test

where id in(11,22,33,44)

order

by sortid

update t_test set sortid =

@maxsid

+ b.nid

from t_test as a

join

@tas b on a.id=b.id

where a.id in(11,22,33,44)

結果:nid

idsortid111

1012

22102333

1034

44104

此方法,會導致sortid無限增加,有可能造成溢位

另外,有的情況可能有要求,必須使用現有的sortid。這就需要將最大的sortid賦給要置頂的目標。頂部和目標之間的項依次下降。

方案2,先針對單條資料的位置移動寫乙個儲存過程

p_swt(原始sortid,目標sortid)

然後取出所有要置頂的元素,遍歷

呼叫 p_swt(原始sortid,最大sortid遞減)

**先不寫了,這個方法在邏輯上比較好理解,也好維護,有一定復用性,比較靈活,

但是比較浪費效能

每次遍歷都需要將很多資料的sortid減一,很多資料會重複多次減一這個動作

方案3,將要置頂的資料中sortid最小也就是最底部的資料一直到全部資料中最大的sortid,之間的sortid分割槽。

這樣,不同區間要下降的位移不同的,每個區間移動一次就可以了

例如:要置頂 11,22,33,44

可以寫成:

update t_test set sortid=sortid-

1where sortid>

44and sortid<=

@maxsid

update t_test set sortid=sortid-

2where sortid>

33and sortid<

44update t_test set sortid=sortid-

3where sortid>

22and sortid<

33update t_test set sortid=sortid-

4where sortid>

11and sortid<

22

然後,按照方案一移動目標資料就可以了

所以剩下的就是如何自動生成上邊的指令碼了

是不是只能遍歷呢?

好像是的。

游標編列或是陣列遍歷都可以

陣列方案:

唯一要注意的就是第一條指令碼生成的時候需要處理一下,或者遍歷之前直接將(@maxsid+1)插入到要遍歷的資料中

這樣指令碼模板比較好寫了,從第二條可是遍歷

update t_test set sortid = sortid - i where sortid>

@current

and sortid<

@prev

此方案需要較多邏輯處理,和方案一一樣不利於維護。復用性不高。

結束。ps:既然必定要一次更新很多條資料,而且除了方案一都會對此更新,併發是不可避免的問題。

如何處理併發呢?

鎖定表? 好像可以,但不利於使用者體驗

鎖定置頂按鈕? 也就是,置頂的時候如果堵塞,返回置頂失敗,這樣只有第乙個可以置頂成功。

Android如何實現一鍵置頂

在很多新聞類專案中,我們向下滑動列表檢視新聞,一般都會實現下拉重新整理,上拉載入更多的功能,有時我們滑到了很底部,這時需要重新整理或上拉到頂部就很麻煩,所以需要一鍵置頂,很多專案中都有這種設計,那麼該怎麼實現呢?下面提供一種實現思路,不是很麻煩,直接上 public class gotopscrol...

overwrite在hive內部表及外部表特性

分析總結 內部表 1.insert intotable 指定相同分割槽可以進行不斷的寫入新資料,指定不同分割槽也可寫入新資料。2.insertoverwrite table 指定相同分割槽會先將之將的資料舊刪除,再進行寫入新資料 指定不同的分割槽則直接寫入新資料。3.使用load data 資料只會...

Zend 雜湊表的內部實現

chapter php中的hash演算法 1.從php的hash 雜湊 演算法開始 2.zend 雜湊表的內部實現 3.php雜湊表結構的深入剖析 資料結構 php中使用乙個叫bucket的結構體表示桶 桶的相關參考linux核心中的hash與bucket 01typedefstructbucket...