SQLite INSERT - ON DUPLICATE KEY UPDATE

MySQL имеет что-то вроде этого:

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

Насколько мне известно, эта функция не существует в SQLite, я хочу знать, есть ли способ архивировать один и тот же эффект без необходимости выполнять два запроса. Кроме того, если это невозможно, что вы предпочитаете:

  • SELECT + (INSERT или UPDATE) или
  • UPDATE (+ INSERT, если UPDATE не работает)

Ответ 1

INSERT OR IGNORE INTO visits VALUES ($ip, 0);
UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;

Для этого требуется, чтобы столбец "ip" имел ограничение UNIQUE (или PRIMARY KEY).


EDIT: Еще одно отличное решение: fooobar.com/questions/16732/....

Ответ 2

Я бы предпочел UPDATE (+ INSERT if UPDATE fails). Меньше кода = меньше ошибок.

Ответ 3

Текущий ответ будет работать только в sqlite или mysql (в зависимости от того, используете ли вы OR или нет). Итак, если вам нужна совместимость с перекрестными dbms, следующее будет...

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

Ответ 4

Вы должны использовать memcached для этого, поскольку это один ключ (IP-адрес), хранящий одно значение (количество посещений). Вы можете использовать функцию атомного приращения, чтобы гарантировать отсутствие условий "гонки".

Это быстрее, чем MySQL, и сохраняет нагрузку, поэтому MySQL может сосредоточиться на других вещах.