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, я хочу знать, есть ли способ архивировать один и тот же эффект без выполнения двух запросов. Кроме того, если это невозможно, что вы предпочитаете:
- выберите + (INSERT или UPDATE) или
- ОБНОВИТЬ (+ВСТАВИТЬ если обновление не удается)
4 ответа:
INSERT OR IGNORE INTO visits VALUES ($ip, 0); UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;
это требует, чтобы столбец "ip" имел уникальное (или первичный ключ) ограничение.
EDIT: еще одно отличное решение:https://stackoverflow.com/a/4330694/89771.
текущий ответ будет работать только в sqlite или mysql (в зависимости от того, используете ли вы или нет). Итак, если вы хотите кросс-совместимость СУБД, выполните следующие действия...
REPLACE INTO `visits` (ip, value) VALUES ($ip, 0);
вы должны использовать memcached для этого, так как это один ключ (IP-адрес), хранящий одно значение (количество посещений). Вы можете использовать функцию атомарного приращения, чтобы обеспечить отсутствие условий "гонки".
это быстрее, чем MySQL, и экономит нагрузку, поэтому MySQL может сосредоточиться на других вещах.