1. Начата процедура восстановления социальных групп. Лидерам старых и новых групп обязательно ознакомиться с регламентом проведения работ.

Mysql как упростить? есть строка, тогда update, нет - insert

Тема в разделе 'Базы данных', создана пользователем dandandan, 6 янв 2012.

  1. Постоянно сталкиваюсь с необходимостью проверки существования строк.

    Проверку делаю с помощью SELECT,
    затем, если строка существует, то делаю UPDATE этой строки,
    Если строка не существует, то делаю INSERT

    Все операции выполняются с одной и той же строкой в одной и той же таблице.

    Можно ли эти 3 операции свести к одному mysql запросу? Или как оптимизировать такие действия?
    Может функцию в mysql прописывать или триггер какой-нибудь (ни с тем ни сдругим дела не имел)?
  2. есть такой синтакс
    INSERT ... ON DUPLICATE KEY UPDATE
    http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
    подойдёт например когда есть уникальное поле, если значение такого поля есть то обновляется, если нет то добавляется
    dandandan и p1kka нравится это.
  3. К сожалению, поля неуникальные. В таблице 3 поля, по которым делается выборка и четвертое поле для вставки значения. Вот если сразу 3 поля взять, то будет уникальным этот блок из трех полей. Как я понимаю ON Duplicate KEY не работает так. В мануале не написано ничего про этот случай.

    Может какая-нибудь связка через IF в mysql запросе возможна ? Что-то вроде IF(SELECT count(id) FROM... =1, UPDATE..., INSERT...)
  4. так поцепи на все 3 поля уникальный ключ
    в любом случае это будет только плюсом при поиске
    да и ON Duplicate KEY будет работать

    >>>Может какая-нибудь связка через IF в mysql запросе возможна ? Что-то вроде IF(SELECT count(id) FROM... =1, UPDATE..., INSERT...)
    так процедурами можно че-то слепить .. но вродь смысла нет с ними играться, UNIQUE INDEX на 3 колонки + ON Duplicate KEY вполне справиться с задачей ( если я ее верно понял )
  5. Не могут значения в этих полях быть уникальными, к сожалению. Только если все три поля слепить воедино, но тогда поиск неудобно будет делать из другого запроса.
  6. я говорю сделать уникальным не каждое из трех полей по отдельности, а все три поля сразу в виде одной уникальной связки

    Код:
    CREATE TABLE test.t2(
      c2 INT(11) UNSIGNED NOT NULL,
      c3 INT(11) UNSIGNED NOT NULL,
      c1 INT(11) UNSIGNED NOT NULL,
      `text` VARCHAR(255) DEFAULT NULL,
      UNIQUE INDEX UK_t2 (c1, c2, c3)       --   ВОТ ТАКОЙ ШТУКОЙ  
    )
    ENGINE = INNODB 
    dandandan нравится это.
  7. т.е. фактически эти поля будут независимы и разделены друг от друга
    но в пределах индекса ( ключа ) они будут "слиты воедино"
  8. Понял, еще 2 вопроса.
    Обязательно тип innodb? и название индекса UK_t2 как-то будет влиять на текст запроса, как в примере по ссылке выше?
    Тут вроде бы индексы нигде не указываются
  9. тип innodb не обязательно
    название индекса используют лишь для тестирования скорости работы запросов ( чтоб видеть где какой индекс юзается ) так что на сам запрос оно никак не повлияет и может быть любым

    >>Тут вроде бы индексы нигде не указываются
    субд сама вчехлит
    dandandan нравится это.
  10. Еще вопросик возник в phpmyadmin при создании индекса можно указать видимо его рамер

    а можно не указывать
    Чем первый вариант лучше или хуже? Что за цифры в конце стоят ? ( 34 ) и ( 50 ) - это количество символов в соответствующем поле базы данных?