如何在 Node.js 使用 mysql 套件做到資料批量更新

一直用 UPDATE 不斷失敗

本來想說跟批量插入的寫法差不多,但一直試都不行

const params = [
  ['PROCESSING', '111'],
  ['PENDING', '222']
]

const sql = 'UPDATE dashboards SET status = ?, WHERE dashboard_id = ?'
connection.query(sql, [parmas], (err, results, fields)
    if (err) {
        console.log('UPDATE ERROR')
        throw err
    }
})

改用 INSERT ... ON DUPLICATE KEY UPDATE

這個 SQL 在 INSERT 以前會先看看你插入的那些值跟資料表內的唯一索引有沒有衝突,有衝突的話就不會 INSERT 而是直接做 UPDATE,總之這樣就能達到批量更新了。

const params = [
  ['111', 'PROCESSING'],
  ['222', 'PENDING']
]

const sql = 'INSERT INTO dashboards (dashboard_id, status) VALUES ? ON DUPLICATE KEY UPDATE status = VALUES(status)'
connection.query(sql, [parmas], (err, results, fields)
    if (err) {
        console.log('UPDATE ERROR')
        throw err
    }
})

affected rows 會是 2

如果更新原本的一個 row 發現顯示的 affected row 是 2,這是正常的,下面這段話就是來自 MySQL 官方文件的。

With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row, 2 if an existing row is updated, and 0 if an existing row is set to its current values.

參考資料

  1. 13.2.7.2 INSERT ... ON DUPLICATE KEY UPDATE Statement%20if%20an%20existing%20row%20is%20set%20to%20its%20current%20values.)

  2. node.js中mysql批量更新的三种方法