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, я хочу знать, есть ли способ архивировать один и тот же эффект без выполнения двух запросов. Кроме того, если это невозможно, что вы предпочитаете:

  1. выберите + (INSERT или UPDATE) или
  2. ОБНОВИТЬ (+ВСТАВИТЬ если обновление не удается)
4 81

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.

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

текущий ответ будет работать только в sqlite или mysql (в зависимости от того, используете ли вы или нет). Итак, если вы хотите кросс-совместимость СУБД, выполните следующие действия...

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

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

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