您好,登錄后才能下訂單哦!
小編給大家分享一下MySQL中怎樣更新排序值以及存儲(chǔ)過(guò)程更新排序值,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
公司有表Task 和 Question,
Question表大致如下
id,bigint(20) student_id,bigint(20) task_id,bigint(20) name,varchar(100) ranking,int(11) not null default 999 comment '排序 根據(jù)ranking和id一起排序'
如上所示, 當(dāng)查詢時(shí)只需sql加個(gè)排序就行, order by ranking, id, 這樣新增時(shí)不用先獲取最大ranking值(或count);
現(xiàn)在新增需求, 此時(shí)ranking最好在增刪改時(shí), 重新排序好(從1開(kāi)始到結(jié)束), 需要將已有數(shù)據(jù)排序好:
# 先定義一個(gè)變量ranking, 在update時(shí)自增 set @ranking = 0; update task_question set ranking = (@ranking := @ranking+1) where task_id = #{Task表主鍵} order by ranking, id;
但是以上sql只能更新某一個(gè)Task的數(shù)據(jù), 我這里需要更新所有的Task, 所以寫了一個(gè)存儲(chǔ)過(guò)程:
# delimiter $$ ???? drop procedure if exists test; # 如果存在名字為test的procedure則刪除 create procedure test() # 創(chuàng)建(創(chuàng)建函數(shù)使用的關(guān)鍵字為function 函數(shù)名()) begin declare taskId bigint; declare flag int default 0; # 這是重點(diǎn),定義一個(gè)游標(biāo)來(lái)記錄sql查詢的結(jié)果(此處的知識(shí)點(diǎn)還有SQL的模糊查詢,見(jiàn)補(bǔ)充) declare taskList cursor for select id from task; # 為下面while循環(huán)建立一個(gè)退出標(biāo)志,當(dāng)游標(biāo)遍歷完后將flag的值設(shè)置為1 declare continue handler for not found set flag=1; open taskList; # 打開(kāi)游標(biāo) # 將游標(biāo)中的值賦給定義好的變量,實(shí)現(xiàn)for循環(huán)的要點(diǎn) fetch taskList into taskId; while flag <> 1 do # 在這里設(shè)置一個(gè)局部變量 ranking set @ranking = 0; update task_question set ranking = (@ranking := @ranking+1) where task_id = taskId order by ranking, id; # 游標(biāo)后移 fetch taskList into taskId; end while; close taskList; # 關(guān)閉游標(biāo) end; # $$ # 執(zhí)行存儲(chǔ)過(guò)程 call test();
以上是“MySQL中怎樣更新排序值以及存儲(chǔ)過(guò)程更新排序值”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。