解説
アップサート(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)などでお気軽に編集部までお寄せください。よろしくお願いいたします。
