踩坑系列之 mysql的effect rows

Posted 咖啡色的羊驼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了踩坑系列之 mysql的effect rows相关的知识,希望对你有一定的参考价值。

前言

这周的时候,和老铁就GoLang中mysql的“effect rows”这个问题讨论起来。

关键点在于:在进行update操作的时候,如果不进行更新(也可以理解为当前数据库就是这样子了)或者没这条数据,effect rows都会为0。

假设一个场景,需要区分这两种情况,就没法解决了。

正文

解决方案寻找过程

1. 命令行验证

通过命令行操作数据库,可以看到,mysql客户端是区分了matched的行数和changed的行数,是可以区分出来上文的情况的。

2. go-mysql包源码

终于找到方式了,那么go的mysql包是不是可以?
后面发现golang的mysql包结果的定义是这样:

type Result interface 
   LastInsertId() (int64, error)
   RowsAffected() (int64, error)


竟然没有!!想象中的,Rows matched!!

3. 网上搜索

那只好在网上寻找解决方案:

这个老外说不可能,what·s your problem?

后面发现CLIENT_FOUND_ROWS蕴含着巨大的能量。

对于update且是CLIENT_FOUND_ROWS时affected_rows返回的是found的行数
对于update且不是CLIENT_FOUND_ROWS是返回的是实际更新的行数

4.实战验证

package main
 
import (
   "database/sql"
   "fmt"
   _ "github.com/go-sql-driver/mysql"
)
 
func main() 
   // 这里是默认情况:db, err := sql.Open("mysql", "root:@/test")
   // 这里是能区分的情况
   db, err := sql.Open("mysql", "root:@/test?clientFoundRows=true")
   if err != nil 
      panic(1)
   
    
   stmt, err := db.Prepare("update test set name=? where id=?")
   if err != nil 
      panic(1)
   
 
   res, err := stmt.Exec("34", 1)
   effectRow, _ := res.RowsAffected()
   fmt.Println(effectRow)

以上代码单纯考虑解决的角度看的,实际情况还需要考虑:

1.如果有使用mysql中间价的话,是不是开放了这个配置clientFoundRows?(因为据我了解这个不是单纯的开一个配置,对于中间价连接池的改造是有一定工作的)
2.开了这个配置之后,对于项目中现存的所有sql语句是否会产生未知的影响?

结论

记住clientFoundRows参数可以区分。

如果你觉得有收获~可以关注我的公众号【咖啡色的羊驼】~第一时间收到我的分享和知识梳理~

以上是关于踩坑系列之 mysql的effect rows的主要内容,如果未能解决你的问题,请参考以下文章

Python 之 增删改查Mysql数据库

Mysql踩坑: Data truncation: Data too long for column ‘xxx‘ at row 1

MySql系列MySql踩坑系列

《Effective C#》系列之(零)——概要

Webpack 踩坑系列之babel 配置

bootstrap之js插件踩坑系列