mysql - SQL变量未在go客户端的选择查询中更新

标签 mysql sql go

我正在 SQL 中运行以下查询。

SET @thisid=0;
SET @serial=0;

SELECT @serial := IF((@thisid != `places`.`id`), @serial + 1, @serial) as `serial`, @thisid := `places`.`id`, `places`.`id` FROM `places`;

变量@serial 基本上只有在新的id 与上一个不同时才会递增。 在终端中运行这些查询并打印@serial 和@thisid 的值后,收到的值为@thisid='id6' @serial=6。

我在 go 代码中执行了这个查询:

if _, err = repo.db.ExecContext(ctx, "SET @thisid=0;"); err != nil {
    return
}

if _, err = repo.db.ExecContext(ctx, "SET @serial=0;"); err != nil {
    return
}

rows, err = repo.db.QueryContext(ctx, fmt.Sprintf(
    "SELECT @serial := IF((@thisid != `places`.`id`), @serial + 1, @serial) as `serial`, @thisid := `places`.`id`, `places`.`id` FROM `places`;",
))
if err != nil {
    fmt.Println("error here")
    return
}

if err = repo.db.QueryRow("SELECT @serial").Scan(&that); err != nil {
    return
}

if err = repo.db.QueryRow("SELECT @thisid").Scan(&this); err != nil {
    return
}

在打印@thisid 和@serial 的值时,@thisid 的值接收到与@serial 的值接收到的值相同的0。它似乎没有动态更新。

最佳答案

Go 使用连接池,这意味着每个查询可能发生在不同的连接上。像这样的变量仅限于连接。如果您需要它们在查询之间持续存在,则需要使用事务来确保您保持在同一个连接中。

关于mysql - SQL变量未在go客户端的选择查询中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56785822/

相关文章:

php - 跨语言开发问题

java - 如何编写可以多次运行但只能插入一次的查询?

go - Go 练习之旅 #8 : Loops and Functions

mysql - Spring Boot : Communications link failure after some hours of inactivity with Hibernate, JDBC 和 MySQL

MySQL如何根据第一个表的条件选择和左连接两个表取决于它自己

php - 步进搜索算法。从 N 中选择一个,重复,重复,查看最终结果

go - 从 fmt.Printf 更改为 exec.Command

java - 如何在数据库中保存特殊字符

MySQL 在非唯一字段上的重复键

go - 简化 golang 中重复出现的 switch case