这种动态更新多行的方法有什么问题?
P粉298305266
P粉298305266 2024-02-26 00:32:34
0
2
336

exports.createTaskDataForNewDay = async function(values) {
  try {
    console.log("values", JSON.stringify(values))
    let pool = await CreatePool() //[timestamp , requiredTimes , reward , difficulty ,taskId , uid , csn]
    let query = "update userTaskData set timestamp = ?,requiredTimes=?,timesCompleted=0,reward=?,difficulty=?,state=1,taskId=?,replacedF=0,replacedC=0 where uid =? and suitCase = ?"
    let resp = await pool.query(query, [values])
    if (resp.changedRows > 0) {
      return resp
    } else return {
      code: 400,
      mesage: "Could not insert data ! please try again or check syntax"
    }
  } catch (error) {
    console.error(error)
    return {
      code: 500,
      message: error.message
    }
  }
}

传递给函数的“值”是一个数组的数组。每个元素保存我想要更新的不同行的占位符数据。 但我收到一个错误,即解析错误 - 语法有问题并且记录的查询是 -

sql: `update userTaskData set timestamp = (1686124176992, 1, '{\"t\":\"c\",\"v\":1000}', 1, 't1', '21GGZzSudOdUjKXcbVQHtFtTK772', 1), (1686124176992, 3, '{\"t\":\"g\",\"v\":10}', 1, 't9', '21GGZzSudOdUjKXcbVQHtFtTK772', 1), (1686124176992, 5, '{\"t\":\"c\",\"v\":4000}', 2, 't17', '21GGZzSudOdUjKXcbVQHtFtTK772', 1), (1686124176992, 3, '{\"t\":\"c\",\"v\":1000}', 3, 't21', '21GGZzSudOdUjKXcbVQHtFtTK772', 1),requiredTimes=?,timesCompleted=0,reward=?,difficulty=?,state=1,taskId=?,replacedF=0,replacedC=0 where uid =? and suitCase = ?

它将所有元素放置在第一个占位符中。它对于插入查询工作得很好。 请告诉我我做错了什么。

P粉298305266
P粉298305266

全部回复(2)
P粉852578075

也许“值”已经是一个数组,不需要包装在另一个数组中。您可以直接传递,如下:

让 resp =等待池.query(查询,值);

P粉038161873

mysqljs/mysql模块不支持通过objectsarrays进行批量记录,用于UPDATE方法与您熟悉的 INSERT 方法相同。您所想象的甚至不是 MySQL 的本机功能并且最多只能通过如果您想使用实际的UPDATE方法,请切换CASE

这给你留下了两个选择:

选项 1

只要您的表和为更新提供的数据包含唯一键,您就可以使用 INSERT INTO table_name SET ?关于重复密钥更新...

选项 2

如果您在给定表的查询中没有唯一的键控字段和相应的值,则必须通过迭代条目来构建查询,这样您最终会得到一个包含任意多个 的字符串集合更新您将拥有的查询 - 或 - 通过构建利用 CASE 条件的查询。

您可以在此处查看一些示例:如何在POST body的基础上创建动态插入语句

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板