同事凍結(jié)行和列(表格如何凍結(jié)行同是又凍結(jié)列)
645
2025-04-02
本文將帶大家聊一下如何同時(shí)自增自減多個(gè)字段
Mysql如何同時(shí)自增自減多個(gè)字段
前言
一、ThinkPHP框架實(shí)現(xiàn)
二、翻騰一下源碼
三、使用SQL語(yǔ)句進(jìn)行實(shí)現(xiàn)
四、總結(jié)
前言
最近小Q同學(xué)去面試了,然后就問(wèn)了題目的問(wèn)題,如何同時(shí)自增自減多個(gè)字段。
小Q一時(shí)回答不出來(lái),最終的結(jié)果就是回家等通知…
關(guān)于這個(gè)問(wèn)題咔咔來(lái)給小Q簡(jiǎn)單的進(jìn)行解答一下。
一、ThinkPHP框架實(shí)現(xiàn)
小Q最熟悉的框架就是ThinkPHP,那么咔咔就先使用ThinkPHP來(lái)解決這個(gè)問(wèn)題。
首先,解決這個(gè)問(wèn)題需要對(duì)框架的inc和setInc有一定的了解,在框架中也就是使用這倆個(gè)函數(shù)進(jìn)行自增或者自減的。
但是倆者是有區(qū)別的,inc是Db類中的方法,setInc實(shí)際調(diào)用的是模型中的方法,但是最終都使用的是thinkphp/library/think/db/Query.php這個(gè)文件的方法。
這一塊的源碼咔咔就不看了,后邊在說(shuō)吧!先解決當(dāng)下問(wèn)題,小Q很著急的。
大家在寫自增的方法時(shí)會(huì)不會(huì)跟小Q一樣一直都使用的是setInc,小Q拿到這個(gè)問(wèn)題時(shí)是這樣想的。
當(dāng)訪問(wèn)時(shí)會(huì)無(wú)情的出現(xiàn)給小Q一個(gè)沉痛一擊。
于是這種方式是不可行的,但是還是想實(shí)現(xiàn)這個(gè)功能怎么辦呢!
不著急咔咔帶你訪問(wèn)新大陸。
直接使用倆個(gè)inc方法來(lái)進(jìn)行對(duì)多字段自增或者自減,那么咔咔這個(gè)思路也是簡(jiǎn)單的看源碼來(lái)的。
又或者大家應(yīng)該都在使用thinkphp框架時(shí)都在一個(gè)查詢中使用過(guò)倆個(gè)where方法吧!其實(shí)思路都一樣既然倆個(gè)where都可以實(shí)現(xiàn)查詢。
那么那倆個(gè)inc應(yīng)該也會(huì)是可以實(shí)現(xiàn)多個(gè)字段進(jìn)行自增或者自減的。
所以說(shuō)咔咔最后的解決方案就是如上圖的解決方案。
二、翻騰一下源碼
在這個(gè)過(guò)程中咔咔還是去無(wú)聊的翻騰了一下關(guān)于inc的實(shí)現(xiàn)過(guò)程。
在下圖中主要看關(guān)于參數(shù)給予的解釋,可以看到第一個(gè)參數(shù)是可以為數(shù)組或者字符串的。
但是在根據(jù)代碼會(huì)發(fā)現(xiàn),雖然支持多個(gè)字段自增或者自減但是步長(zhǎng)卻是一個(gè)值。
所以說(shuō)框架給提供的這個(gè)方法是可以同時(shí)自增或者自減多個(gè)字段,但是值只能是固定的。
如果想要實(shí)現(xiàn)多個(gè)字段多個(gè)步長(zhǎng)就需要來(lái)修改源碼來(lái)解決這個(gè)問(wèn)題。
以下是咔咔修改源碼后的內(nèi)容,可以跟inc源碼那一幅圖做對(duì)比。
咔咔修改的源碼主要為圈到的地方,因?yàn)閟tep這個(gè)值在源碼中是直接給定義為1了。
所以就需要修改這一塊,使用is_array來(lái)進(jìn)行檢測(cè)這個(gè)變量是否為數(shù)組就可以了。
經(jīng)過(guò)以上的操作就可以實(shí)現(xiàn)針對(duì)多個(gè)字段多個(gè)步長(zhǎng)進(jìn)行自增或者自減了。
咔咔這種直接修改源碼是不建議大家借鑒的,只是針對(duì)一個(gè)問(wèn)題我們要學(xué)會(huì)去在源碼中找到解決方案。
所以說(shuō)針對(duì)如何同時(shí)自增自減多個(gè)字段這個(gè)問(wèn)題咔咔還是建議使用方案一的解決方法。
畢竟這種情況是屬于少數(shù)的,在框架基礎(chǔ)改著改著自己都會(huì)亂。
三、使用SQL語(yǔ)句進(jìn)行實(shí)現(xiàn)
如果為了解決問(wèn)題這一節(jié)的內(nèi)容就不用在看了,看第一節(jié)就可以完美的解決你的問(wèn)題了。
咔咔是喜歡琢磨一個(gè)問(wèn)題使用多種方案進(jìn)行解決。
那么接下來(lái)咔咔再使用SQL語(yǔ)句對(duì)這個(gè)問(wèn)題進(jìn)行深度的解析。
既然咱們都已經(jīng)在第一節(jié)中將實(shí)現(xiàn)方案都已經(jīng)實(shí)現(xiàn)了,在框架中有一個(gè)方法fetchSql(),可以直接打印出sql語(yǔ)句。
那么就來(lái)看一下這個(gè)sql語(yǔ)句是什么樣的。
UPDATE `table` SET `filed1` = `filed1` + 200 , `filed2` = `filed2` + 86 WHERE `time` BETWEEN 1609689600 AND 1609775999
1
2
以上就是使用框架提供的方法打印出的SQL語(yǔ)句,表名和字段咔咔都做了更改,直接修改為自己需要自增或者自減的字段即可。
使用這個(gè)SQL語(yǔ)句是可以解決本文主題的,所以咔咔就沒有給出打印結(jié)果一系列的截圖,如果感興趣的可以去自己測(cè)試一下。
俗話說(shuō)的好,光說(shuō)不練假把式,還是需要自己進(jìn)行多多練習(xí)的。
以上就是使用原生sql在框架中實(shí)現(xiàn)的同時(shí)自增自減多個(gè)字段并且多個(gè)步長(zhǎng)。
四、總結(jié)
這個(gè)問(wèn)題其實(shí)本質(zhì)很簡(jiǎn)單,框架也給提供了對(duì)應(yīng)的方法,只需要直接調(diào)用就行了。
問(wèn)題難在就是對(duì)框架給提供的自增或者自減的方法你知道幾個(gè),框架給提供了inc和setInc這個(gè)倆種方式。
如果你只知道setInc那豈不是就吉吉思密達(dá)了,所以沒事還是多看看源碼和文檔,對(duì)你只有好處沒有壞處。
還有一個(gè)問(wèn)題就是關(guān)于咔咔在文章中提到了使用新的方式來(lái)實(shí)現(xiàn)同時(shí)自增自減多個(gè)字段,這種方式在框架底層進(jìn)行了修改。
這種實(shí)現(xiàn)方式不推薦使用,修改源碼只是為了測(cè)試,也是對(duì)自己閱讀源碼的能力進(jìn)行提升,而不是在框架底層無(wú)所畏懼的進(jìn)行修改。
堅(jiān)持學(xué)習(xí)、堅(jiān)持寫博、堅(jiān)持分享是咔咔從業(yè)以來(lái)一直所秉持的信念。希望在偌大互聯(lián)網(wǎng)中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。
Mysql SQL
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。