Upsert
最後更新
本頁說明 upsert() 如何組出 INSERT ... ON DUPLICATE KEY UPDATE,以及第二個參數的三種形式。
基本用法
upsert(data, updateData?) 以 data 執行 INSERT;命中 PRIMARY KEY 或 UNIQUE 索引時改為更新(src/MySQLPool.ts:316-360)。
| 項目 | 行為 |
|---|---|
| 連線池 | 寫入池 |
| 回傳 | insertId;為 0 時回傳 null |
data 的值 |
全部以佔位符綁定,不套用函式白名單 |
updateData 的三種形式
| 形式 | 範例 | 產生的 UPDATE 子句 |
|---|---|---|
| 省略 | upsert({ email: "e", name: "n" }) |
`email` = VALUES(`email`), `name` = VALUES(`name`) |
| 物件 | upsert({ email: "e" }, { updated_at: "NOW()", hits: 3 }) |
`updated_at` = NOW(), `hits` = ? |
| 字串 | upsert({ email: "e" }, "hits = hits + 1") |
hits = hits + 1 |
// 以 email 為唯一索引:不存在就新增,存在就累加次數並更新時間
await MySQLPool
.table("subscribers")
.upsert(
{ email: "john@example.com", hits: 1 },
"hits = hits + 1, updated_at = NOW()"
);