先考慮按sortid降序排列的情況。初始狀態sortid=id
方案1,首先獲取當前最大的sortid,例如:@maxsid = 100
其次,將要置頂的行重新公升序排列放入表變數裡,並新增一列序號列
select row_number() over(orderby 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...