這種動態更新多行的方法有什麼問題?
P粉298305266
P粉298305266 2024-02-26 00:32:34
0
2
356

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的基礎上建立動態插入語句

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板