<rmcreative>

RSS

Все заметки с тегами «MySQL, ON DUPLICATE KEY UPDATE»

Можно уточнить:

  1. MySQL, REPLACE INTO и ON DUPLICATE KEY UPDATE

    23 декабря 2012

    В MySQL есть два расширения, которые позволяют атомарно вставить или обновить запись. Годятся они для штук с довольно высокой нагрузкой, когда без блокировок не работает типичный сценарий:

    1. Выбрать запись.
    2. Если выбралась — обновить.
    3. Если пусто — вставить.

    REPLACE

    REPLACE INTO
      vote
    SET
      user_id = 13,
      object_id = 42,
      value = 7

    INSERT INTO ON DUPLICATE KEY UPDATE

    INSERT INTO
      vote
    SET
      user_id = 13,
      object_id = 42,
      value = 7
    ON DUPLICATE KEY UPDATE
      value = 7

    Сходства

    И то и то выражение в итоге даст примерно тот же результат. При нарушении ограничения на уникальность (то есть UNIQUE KEY или PRIMARY KEY) не будет никакой ошибки. Для ключа user_id, object_id в базе будет единственная запись с значением 7.

    Отличия

    Кроме очевидного отличия в синтаксисе есть и очень важно отличие в том, как всё это работает. REPLACE при срабатывании ограничения удаляет запись (и вызывает ON DELETE CASCADE) и затем вставляет новую, что не так быстро, как ON DUPLICATE KEY UPDATE, который обновляет запись без удаления.

    11 комментариев