解説
アップサート(upsert)は、アップデート(update)とインサート(insert)を融合したデータベース用語です。既存の行があれば更新し、なければ新規に挿入する処理を指します。
アップサートを実現する構文は、データベースの種類によって異なります。同じSQLでも、MySQLやSQLiteなどで、書き方が違います。そのため、それぞれの環境で、書き方を確かめる必要があります。
サンプル
「アップサート」のサンプルです。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>「アップサート」のサンプル</title> <style> #output { font-size: 32px; line-height: 1.5; white-space: pre-wrap; } </style> </head> <body> <pre id="output"></pre> <script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.12.0/sql-wasm.js"></script> <script> window.addEventListener('DOMContentLoaded', async e => { // 出力用の関数 const print = function() { const el = document.querySelector('#output'); el.textContent += [...arguments].map(x => `${x}`).join(', ') + '\n'; }; const printDB = function(title) { print(`----- ${title} -----`); res = db.exec('SELECT * FROM pet;'); print(JSON.stringify(res[0].columns)); res[0].values.forEach((value, i) => { print(i, JSON.stringify(value)); }); }; // SQLite let res; const SQL = await initSqlJs({ locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.12.0/${file}` }); const db = new SQL.Database(); db.exec('CREATE TABLE pet(id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE, age INTEGER)'); // インサート db.exec("INSERT INTO pet (name, age) VALUES ('Tama', 1)"); db.exec("INSERT INTO pet (name, age) VALUES ('Cocoa', 2)"); db.exec("INSERT INTO pet (name, age) VALUES ('Kuro', 3)"); printDB('インサート'); // アップデート res = db.exec("UPDATE pet SET age = 3 WHERE name = 'Cocoa'"); res = db.exec("UPDATE pet SET age = 4 WHERE name = 'Kuro'"); printDB('アップデート'); // アップサート(更新) db.exec("INSERT INTO pet (name, age) VALUES ('Tama', 2) ON CONFLICT(name) DO UPDATE SET age = 2"); printDB('アップサート(更新)'); // アップサート(挿入) db.exec("INSERT INTO pet (name, age) VALUES ('Mike', 9) ON CONFLICT(name) DO UPDATE SET age = 9"); printDB('アップサート(挿入)'); }); </script> </body> </html>
----- インサート ----- ["id","name","age"] 0, [1,"Tama",1] 1, [2,"Cocoa",2] 2, [3,"Kuro",3] ----- アップデート ----- ["id","name","age"] 0, [1,"Tama",1] 1, [2,"Cocoa",3] 2, [3,"Kuro",4] ----- アップサート(更新) ----- ["id","name","age"] 0, [1,"Tama",2] 1, [2,"Cocoa",3] 2, [3,"Kuro",4] ----- アップサート(挿入) ----- ["id","name","age"] 0, [1,"Tama",2] 1, [2,"Cocoa",3] 2, [3,"Kuro",4] 3, [4,"Mike",9]
フィードバックお待ちしております!
ご感想、解説してほしい用語、解説内容のアドバイスなどございましたら、FacebookやX(旧Twitter)などでお気軽に編集部までお寄せください。よろしくお願いいたします。