MySQL如何同時自增自減多個字段

本文將帶你們聊一下如何同時自增自減多個字段php

前言

最近小Q同窗去面試了,而後就問了題目的問題,如何同時自增自減多個字段。web

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

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

1、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應該也會是能夠實現多個字段進行自增或者自減的。

因此說咔咔最後的解決方案就是如上圖的解決方案。

2、翻騰一下源碼

在這個過程當中咔咔仍是去無聊的翻騰了一下關於inc的實現過程。

在下圖中主要看關於參數給予的解釋,能夠看到第一個參數是能夠爲數組或者字符串的。

可是在根據代碼會發現,雖然支持多個字段自增或者自減可是步長倒是一個值。

因此說框架給提供的這個方法是能夠同時自增或者自減多個字段,可是值只能是固定的

inc的源碼

若是想要實現多個字段多個步長就須要來修改源碼來解決這個問題。

例如想實現多個字段對應多個步長

如下是咔咔修改源碼後的內容,能夠跟inc源碼那一幅圖作對比。

咔咔修改的源碼主要爲圈到的地方,由於step這個值在源碼中是直接給定義爲1了。

因此就須要修改這一塊,使用is_array來進行檢測這個變量是否爲數組就能夠了。

修改源碼

通過以上的操做就能夠實現針對多個字段多個步長進行自增或者自減了。

咔咔這種直接修改源碼是不建議你們借鑑的,只是針對一個問題咱們要學會去在源碼中找到解決方案。

因此說針對如何同時自增自減多個字段這個問題咔咔仍是建議使用方案一的解決方法。

畢竟這種狀況是屬於少數的,在框架基礎改着改着本身都會亂。

3、使用SQL語句進行實現

若是爲了解決問題這一節的內容就不用在看了,看第一節就能夠完美的解決你的問題了。

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

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

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

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

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

以上就是使用框架提供的方法打印出的SQL語句,表名和字段咔咔都作了更改,直接修改成本身須要自增或者自減的字段便可。

原生SQL實現方案

使用這個SQL語句是能夠解決本文主題的,因此咔咔就沒有給出打印結果一系列的截圖,若是感興趣的能夠去本身測試一下。

俗話說的好,光說不練假把式,仍是須要本身進行多多練習的。

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

4、總結

這個問題其實本質很簡單,框架也給提供了對應的方法,只須要直接調用就好了。

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

若是你只知道setInc那豈不是就吉吉思密達了,因此沒事仍是多看看源碼和文檔,對你只有好處沒有壞處。

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

這種實現方式不推薦使用,修改源碼只是爲了測試,也是對本身閱讀源碼的能力進行提高,而不是在框架底層無所畏懼的進行修改。

堅持學習、堅持寫博、堅持分享是咔咔從業以來一直所秉持的信念。但願在偌大互聯網中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。


本文分享自微信公衆號 - PHP初學者必看(PHP0022)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索