一文詳解MySQL如何同時自增自減多個欄位

程式猿就是我發表於2021-05-10

本文將帶大家聊一下如何同時自增自減多個欄位

開始之前,先分享一套MySQL教程?,小白入門或者學習鞏固都可以看?

MySQL基礎入門-mysql教程-資料庫實戰(MySQL基礎+MySQL高階+MySQL優化+MySQL34道作業題)_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili

前言

最近小Q同學去面試了,然後就問了題目的問題,如何同時自增自減多個欄位。

小Q一時回答不出來,最終的結果就是回家等通知…

關於這個問題小編來給小Q簡單的進行解答一下。

一、ThinkPHP框架實現

小Q最熟悉的框架就是ThinkPHP,那麼咔咔就先使用ThinkPHP來解決這個問題。

首先,解決這個問題需要對框架的inc和setInc有一定的瞭解,在框架中也就是使用這倆個函式進行自增或者自減的。

但是倆者是有區別的,inc是Db類中的方法,setInc實際呼叫的是模型中的方法,但是最終都使用的是thinkphp/library/think/db/Query.php這個檔案的方法。

這一塊的原始碼就不看了,後邊在說吧!先解決當下問題,小Q很著急的。

大家在寫自增的方法時會不會跟小Q一樣一直都使用的是setInc,小Q拿到這個問題時是這樣想的。

 

 

當訪問時會無情的出現給小Q一個沉痛一擊。

 

 

於是這種方式是不可行的,但是還是想實現這個功能怎麼辦呢!

不著急小編帶你訪問新大陸。

直接使用倆個inc方法來進行對多欄位自增或者自減,那麼小編這個思路也是簡單的看原始碼來的。

 

 

又或者大家應該都在使用thinkphp框架時都在一個查詢中使用過倆個where方法吧!其實思路都一樣既然倆個where都可以實現查詢。

那麼那倆個inc應該也會是可以實現多個欄位進行自增或者自減的。

所以說小編最後的解決方案就是如上圖的解決方案。

二、翻騰一下原始碼

在這個過程中小編還是去無聊的翻騰了一下關於inc的實現過程。

在下圖中主要看關於引數給予的解釋,可以看到第一個引數是可以為陣列或者字串的。

但是在根據程式碼會發現,雖然支援多個欄位自增或者自減但是步長卻是一個值。

所以說框架給提供的這個方法是可以同時自增或者自減多個欄位,但是值只能是固定的。

 

 

如果想要實現多個欄位多個步長就需要來修改原始碼來解決這個問題。

 

 

以下是小編修改原始碼後的內容,可以跟inc原始碼那一幅圖做對比。

小編修改的原始碼主要為圈到的地方,因為step這個值在原始碼中是直接給定義為1了。

所以就需要修改這一塊,使用is_array來進行檢測這個變數是否為陣列就可以了。

 

 

經過以上的操作就可以實現針對多個欄位多個步長進行自增或者自減了。

小編這種直接修改原始碼是不建議大家借鑑的,只是針對一個問題我們要學會去在原始碼中找到解決方案。

所以說針對如何同時自增自減多個欄位這個問題小編還是建議使用方案一的解決方法。

畢竟這種情況是屬於少數的,在框架基礎改著改著自己都會亂。

三、使用SQL語句進行實現

如果為了解決問題這一節的內容就不用在看了,看第一節就可以完美的解決你的問題了。

小編是喜歡琢磨一個問題使用多種方案進行解決。

那麼接下來小編再使用SQL語句對這個問題進行深度的解析。

既然我們們都已經在第一節中將實現方案都已經實現了,在框架中有一個方法fetchSql(),可以直接列印出sql語句。

那麼就來看一下這個sql語句是什麼樣的。

1 UPDATE `table` SET `filed1` = `filed1` + 200 , `filed2` = `filed2` + 86 WHERE `time`
2 BETWEEN 1609689600 AND 1609775999


以上就是使用框架提供的方法列印出的SQL語句,表名和欄位小編都做了更改,直接修改為自己需要自增或者自減的欄位即可。

 

 

使用這個SQL語句是可以解決本文主題的,所以小編就沒有給出列印結果一系列的截圖,如果感興趣的可以去自己測試一下。

俗話說的好,光說不練假把式,還是需要自己進行多多練習的。

以上就是使用原生sql在框架中實現的同時自增自減多個欄位並且多個步長。

四、總結

這個問題其實本質很簡單,框架也給提供了對應的方法,只需要直接呼叫就行了。

問題難在就是對框架給提供的自增或者自減的方法你知道幾個,框架給提供了inc和setInc這個倆種方式。

如果你只知道setInc那豈不是就吉吉思密達了,所以沒事還是多看看原始碼和文件,對你只有好處沒有壞處。

還有一個問題就是關於小編在文章中提到了使用新的方式來實現同時自增自減多個欄位,這種方式在框架底層進行了修改。

這種實現方式不推薦使用,修改原始碼只是為了測試,也是對自己閱讀原始碼的能力進行提升,而不是在框架底層無所畏懼的進行修改。

 

相關文章