Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go中的错误MySQL_Mysql_Sql_Go_Sql Update - Fatal编程技术网

Go中的错误MySQL

Go中的错误MySQL,mysql,sql,go,sql-update,Mysql,Sql,Go,Sql Update,此代码正在运行: stmt, err := db.Prepare("UPDATE `test` SET `score` = ? WHERE id = ?") CheckErr(err) _, err = stmt.Exec(value, id) 但当我更改代码时,它不起作用: stmt, err := db.Prepare("UPDATE `test` SET ? = ? WHERE id = ?") CheckErr(err) _, err = stmt.Exec("score", valu

此代码正在运行:

stmt, err := db.Prepare("UPDATE `test` SET `score` = ? WHERE id = ?")
CheckErr(err)
_, err = stmt.Exec(value, id)
但当我更改代码时,它不起作用:

stmt, err := db.Prepare("UPDATE `test` SET ? = ? WHERE id = ?")
CheckErr(err)
_, err = stmt.Exec("score", value, id)

有什么问题吗?

您必须在数据库更新语句中提到列名。如果update查询的集合行中没有列名,则不会准备该列名。

无论好坏,参数只能用于查询中的文字常量。这些值通常是
where
子句中的比较值,有时是
select
set
子句中的常量,在查询的其他部分中则不太常见

标识符不是文字常量。事实上,以下情况都不是:

  • 数据库、表和列名
  • 函数名
  • 运算符(如
    +
  • 关键词(如
    order by
    中的
    asc
    /
    desc
不幸的是,要“动态”实现这些,您需要通过直接修改字符串来修改查询字符串。这很恶心,但没有其他选择

这种方法的好处之一是,它允许数据库存储查询计划,然后重新使用。对于非常快速的查询,消除编译阶段可能是一个重要的性能增益

编辑:

我真的不知道该怎么办,但我的想法是:

sql := "UPDATE `test` SET [col] = ? WHERE id = ?"

sql = strings.replace(sql, "[col]", "score")

stmt, err := db.Prepare(sql)
CheckErr(err)
_, err = stmt.Exec(value, id)

换句话说,直接更改标识符的查询字符串。继续对值使用参数。

我是否应该为函数的任何更新编写参数?有没有办法在stmt.Exec(“score”,value,id)中写入列名?错误告诉您什么?可能是@Flimzy的重复项太长了!!2018/08/28 15:24:54 http:panic serving 127.0.0.1:21801:Error 1064:SQL语法有错误;检查与MySQL SERVER r版本相对应的手册,以了解在“?=”附近使用的正确语法?其中id=?'位于第1行goroutine 5[运行]:net/http(*conn).service.func1(0xc04204c960)C:/Go/src/net/http/server.Go:1726+0xd7 panic(0x67cae0,0xc0420c2920)C:/Go/src/runtime/panic.Go:502+0x237 main.checker(0x70e940,0xc0420c2920)G:/code/Go/src/aHTTP/main.Go:138+0x51 main.MySQL()什么太长了?@Flimzy一个错误!我现在该怎么办?@Kaedys。非常感谢。