107

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. UPDATE(+ UPDATEが失敗した場合はINSERT )
4

5 に答える 5

122
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 。

于 2010-04-27T02:30:42.023 に答える
49

3.24.0以降、SQLiteはアップサートもサポートしているため、次のように簡単に記述できます。

INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON CONFLICT(ip) DO UPDATE SET hits = hits + 1;
于 2018-11-01T10:23:45.963 に答える
19

私は好きUPDATE (+ INSERT if UPDATE fails)です。コードが少ない=バグが少ない。

于 2010-04-26T23:21:15.683 に答える
7

現在の回答は、sqliteまたはmysqlでのみ機能します(ORを使用するかどうかによって異なります)。したがって、データベース間の互換性が必要な場合は、次のようにします...

REPLACE INTO `visits` (ip, value) VALUES ($ip, 0);
于 2012-11-17T02:53:45.697 に答える
-4

memcachedは単一の値(訪問数)を格納する単一のキー(IPアドレス)であるため、これにはmemcachedを使用する必要があります。アトミックインクリメント関数を使用して、「競合」状態がないことを確認できます。

MySQLよりも高速で負荷を節約できるため、MySQLは他のことに集中できます。

于 2011-10-05T15:28:15.220 に答える