web-dev-qa-db-ja.com

SQLite INSERT-重複キーの更新(UPSERT)

MySQLには次のようなものがあります。

INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;

この機能がSQLiteに存在しないことを知っている限り、2つのクエリを実行せずに同じ効果を達成する方法があるかどうかを知りたいと思います。また、これが不可能な場合、あなたは何を好みますか:

  1. SELECT +(INSERTまたはUPDATE)または
  2. PDATE(+ INSERTUPDATEが失敗した場合
89
Alix Axel

.24.0以降のSQLiteはupsertもサポートしているため なので、次のように書くことができます

INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON CONFLICT(ip) DO UPDATE SET hits = hits + 1;
12
szmate1618
INSERT OR IGNORE INTO visits VALUES ($ip, 0);
UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;

これには、 "ip"列にUNIQUE(またはPRIMARY KEY)制約が必要です。


編集:別の素晴らしいソリューション: https://stackoverflow.com/a/4330694/89771

113
dan04

UPDATE (+ INSERT if UPDATE fails)を好みます。少ないコード=少ないバグ。

18
codeholic

現在の答えは、sqlite OR mysql(ORを使用するかどうかによって異なります)でのみ動作します。しましょう...

REPLACE INTO `visits` (ip, value) VALUES ($ip, 0);
7
Jacob Thomason