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 может сосредоточиться на других вещах.