mysql in 多个字段_MySQL如何同时自增自减多个字段

本文将带大家聊一下如何同时自增自减多个字段

前言

最近小Q同学去面试了,然后就问了题目的问题,如何同时自增自减多个字段。

小Q一时回答不出来,最终的结果就是回家等通知....

关于这个问题咔咔来给小Q简单的进行解答一下。

一、ThinkPHP框架实现

小Q最熟悉的框架就是ThinkPHP,那么咔咔就先使用ThinkPHP来解决这个问题。

首先,解决这个问题需要对框架的inc和setInc有一定的了解,在框架中也就是使用这俩个函数进行自增或者自减的。

但是俩者是有区别的,inc是Db类中的方法,setInc实际调用的是模型中的方法,但是最终都使用的是thinkphp/library/think/db/Query.php这个文件的方法。

这一块的源码咔咔就不看了,后边在说吧!先解决当下问题,小Q很着急的。

大家在写自增的方法时会不会跟小Q一样一直都使用的是setInc,小Q拿到这个问题时是这样想的。

c4992e58df184b9dd6e0aa4359bfaab2.png
初步方案

当访问时会无情的出现给小Q一个沉痛一击。

50d3542ae6384733ea159e962acf9390.png
报错信息

于是这种方式是不可行的,但是还是想实现这个功能怎么办呢!

不着急咔咔带你访问新大陆。

直接使用俩个inc方法来进行对多字段自增或者自减,那么咔咔这个思路也是简单的看源码来的。

9129fcb77785832b67f463b060f0265b.png
最终方案

又或者大家应该都在使用thinkphp框架时都在一个查询中使用过俩个where方法吧!其实思路都一样既然俩个where都可以实现查询。

那么那俩个inc应该也会是可以实现多个字段进行自增或者自减的。

所以说咔咔最后的解决方案就是如上图的解决方案。

二、翻腾一下源码

在这个过程中咔咔还是去无聊的翻腾了一下关于inc的实现过程。

在下图中主要看关于参数给予的解释,可以看到第一个参数是可以为数组或者字符串的。

但是在根据代码会发现,虽然支持多个字段自增或者自减但是步长却是一个值。

所以说框架给提供的这个方法是可以同时自增或者自减多个字段,但是值只能是固定的

1afef390017e8891d3ff8e9733ee754a.png
inc的源码

如果想要实现多个字段多个步长就需要来修改源码来解决这个问题。

1ef046d4e392dec1c1bcdf4a233e5e13.png
例如想实现多个字段对应多个步长

以下是咔咔修改源码后的内容,可以跟inc源码那一幅图做对比。

咔咔修改的源码主要为圈到的地方,因为step这个值在源码中是直接给定义为1了。

所以就需要修改这一块,使用is_array来进行检测这个变量是否为数组就可以了。

1595a39d90d7654ba0c56ff7d4d099d2.png
修改源码

经过以上的操作就可以实现针对多个字段多个步长进行自增或者自减了。

咔咔这种直接修改源码是不建议大家借鉴的,只是针对一个问题我们要学会去在源码中找到解决方案。

所以说针对如何同时自增自减多个字段这个问题咔咔还是建议使用方案一的解决方法。

毕竟这种情况是属于少数的,在框架基础改着改着自己都会乱。

三、使用SQL语句进行实现

如果为了解决问题这一节的内容就不用在看了,看第一节就可以完美的解决你的问题了。

咔咔是喜欢琢磨一个问题使用多种方案进行解决。

那么接下来咔咔再使用SQL语句对这个问题进行深度的解析。

既然咱们都已经在第一节中将实现方案都已经实现了,在框架中有一个方法fetchSql(),可以直接打印出sql语句。

那么就来看一下这个sql语句是什么样的。

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

以上就是使用框架提供的方法打印出的SQL语句,表名和字段咔咔都做了更改,直接修改为自己需要自增或者自减的字段即可。

3a543cbaa50448719a19abd8ad335811.png
原生SQL实现方案

使用这个SQL语句是可以解决本文主题的,所以咔咔就没有给出打印结果一系列的截图,如果感兴趣的可以去自己测试一下。

俗话说的好,光说不练假把式,还是需要自己进行多多练习的。

以上就是使用原生sql在框架中实现的同时自增自减多个字段并且多个步长。

四、总结

这个问题其实本质很简单,框架也给提供了对应的方法,只需要直接调用就行了。

问题难在就是对框架给提供的自增或者自减的方法你知道几个,框架给提供了inc和setInc这个俩种方式。

如果你只知道setInc那岂不是就吉吉思密达了,所以没事还是多看看源码和文档,对你只有好处没有坏处。

还有一个问题就是关于咔咔在文章中提到了使用新的方式来实现同时自增自减多个字段,这种方式在框架底层进行了修改。

这种实现方式不推荐使用,修改源码只是为了测试,也是对自己阅读源码的能力进行提升,而不是在框架底层无所畏惧的进行修改。

坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wxpython 调用子窗口_wxpython入门第一步(简单例子)

在这部分wxPython教程中,我们将创建一些简单的例子。简单的例子​ 我们从一个非常简单的例子开始。我们的第一个脚本将只显示一个小窗口。它不会做太多事情。我们将逐行分析这个脚本。# simple.pyimport wxapp wx.App()frame wx.Frame(None, )frame.Show()app.Mai…

orderd mysql_Oracle入门教程:leading vs ordered hint

odered hint 可以指示oracle 使用from 关键字后面的表的顺序进行join连接!cbo会优先按照from 后面的表的顺序来进行join,当统计leading hint 可以指示Oracle使用leading 中指定的表作为驱动表,比如 正常的访问计划如下SCOTT> select e.ename, hiredat…

sed mysql配置文件_shell解析my.cnf配置文件

my.cnf配置格式如下vi my.cnf[client]port3306socket/tmp/mysql.socket[mysqld]port3306server-id1datadir/usr/local/mysql/data[mysqld_safe]port3306more parseMy.sh#!/bin/bashcnf$(cd dirname $0;pwd)"/my.cnf"#得到区块数组g_sec(sed -n ‘/\[*\]/p‘ $cnf |gr…

mysql标识列从一开始_mysql中标识列是什么意思有什么用

标识列是什么?标识列又称为自增长列。含义:可以不用手动的插入值,系统提供默认的序列值特点:1、标识列必须和主键搭配吗?不一定,但要求是一个key2、一个表可以有几个标识列?至多一个&#xff01…

mysql 及时点还原_mysqlbinglog基于即时点还原

mysqlbinlog介绍要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini,取决于你的系统)中找到路径。(mysql5.7开启binglog 时需要同时设置server-id否则无法启动)要想确定当前的二进制日志文件…

mysql 查询此时日期_mysql 查询日期

//查看本月数据SELECT*FROMcontent_publishWHEREdate_format(publish_time, "%Y %m") date_format(DATE_SUB(curdate(), INTERVAL 0 MONTH),"%Y %m")//查看上个月数据SELECT*FROMcontent_publishWHEREdate_format(publish_time, "%Y %m") date…

python mysql查表_python进阶(十、mysql:单表查询)

3.mysql数据库3.10 单表查询3.10.1. 简单查询查询在数据库中使用的频率是最高的:十次查询,一次增删改。1)建表2)插入数据3.10.1.1. 选择字段:selectselect 字段名1,字段名2…… from 表名 where 条件;3.10.1.2. 字段重命名(别名):…

python常见的数值运算符_第18 p,Python中各种常用的运算符,特别是增量运算符...

原标题:第18 p,Python中各种常用的运算符,特别是增量运算符大家好,我是杨数Tos,这是《从零基础到大神》系列课程的第18篇文章,第二阶段的课程:Python基础知识:Python中各种常用的运算…

python画害羞的表情_用Python把你的朋友变成表情包

一、项目说明在日常生活中,我们经常会存取一些朋友们的丑照,在这个项目中,我们以萌萌哒的熊猫头作为背景,然后试着在背景图上加入朋友们的照片。效果如下图所示:二、实现步骤导入朋友的照片(前景照片);处理…

java8安装_科学网—Java JDK 8 的安装以及环境变量的配置(Linux and Windows) - 彭勇的博文...

Java JDK 8 的安装以及环境变量的配置(Linux and Windows)JDK(Java Development Kit)包括了Java语言的编译器,可以在这里下载:根据操作系统选择相应的版本。Java JDK 8 在 Windows 8.1下的安装以及环境变量的配置在Windows 中,双击安装就是。…

龙贝格算法例题_数值分析实验报告——龙贝格求积算法 椭圆周长公式

椭圆周长公式数值分析实验报告 专业 信息与计算科学 班级 信计101 姓名 学号 协作队员 实验日期 2013 年 1 月 5 日 星期 六 成绩评定 教师签名 批改日期 题目 一、 问题提出 教材136页12题用龙贝格求积算法计算其近似值(加速3次) 地球卫星轨道是一个椭圆,椭圆周长的…

java控制台输入数组_Java控制台输入数组并逆序输出的方法实例

输入一个数组,然后颠倒次序进行输出,这种算法在程序开发中经常用到,下面我们通过一个小实例来看看怎么实现在控制台输入一个数组,并让其逆序输出的。源码:import java.util.Scanner;public class Test01 {public stati…

java map 优化_java.util.map和java.util.set的优化实现?

您可以通过以下方式节省一点内存:(a)使用A更强、更宽的哈希代码因此避免储存钥匙;(b)从阵列中分配自己,避免为每个哈希表条目创建单独的对象.如果它是有用的,这里是一个不加修饰的Java实现数字接收器我有时发现哈希表很有用。您可以直接在一个字符序列(包括字符串)上键入键,否则…

.net md5 java 偏移量_C# java MD5加密方不一致问题

说来惭愧,做开发几年了,一直在吸取,今天也写写自已关于技术的一点点理解,不正之处,请大家多多指点。由于之前开发的项目使用的是C#,用户信息使用的C#的MD5加密码方式,而现在需要切换到Java平台下&#xff0…

java 传递bean_Java:如何将值从类/ bean传递给servlet

您没有将某些内容传递给servlet.你只需让servlet访问一些东西.您应该摆脱main()方法并将数据库交互代码移动到DAO类中.我还给模型类(带有时区和位置)一个以大写字母开头的更敏感的名称.总而言之,您应该更新代码,使其看起来如下所示:模型类,区域(只要它有意义,任意你…

java程序员的电脑配置_JAVA程序员笔记本电脑推荐?

如果主要是做JAVA开发,那其实需要考虑的因素有:CPU性能必须过得去,因为java相对来说比较消耗CPU资源,当然是大型java应用,题主如果学习java的时候,倒不是特别重要,基本上2020年主流笔记本CPU都可…

java oracle sql 参数_oracle pl/sql之在java中调用带有输入输出参数的oracle存储过程...

只需注意一点输出参数是用CallableStatement里面的registerOutParameter方法注册进去存储过程:import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;imp…

linux mysql 静态库_Linux静态库与动态库实例详解

Linux静态库与动态库实例详解1. Linux 下静态链接库编译与使用首先编写如下代码&#xff1a;// main.c#include "test.h"int main(){test();return 0;}// test.h#includeusing namespace std;void test();// test.c#include "test.h"void test(){cout<&…

java计算距离_java实现计算地理坐标之间的距离

java实现计算两经纬度点之间的距离&#xff0c;直接上代码&#xff0c;具体解释请参考注释package com.jttx.poi.utils;import com.jttx.poi.entity.point;/*** created by louis on 2014/9/2.*/public class geoutils {/*** 计算两经纬度点之间的距离(单位&#xff1a;米)* pa…

java htmlparser 使用教程_HTMLParser使用详解(1)

在研究搜索引擎的开发中&#xff0c;对于HTML网页的处理是核心的一个环节。网上有很多开源的代码&#xff0c;对于Java来说&#xff0c;HTMLParser是比较著名并且得到广泛应用的一个。HTMLParser的主页是http://htmlparser.sourceforge.net/&#xff0c;最后的更新是2006年9月的…