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

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

Модераторы: latteo
  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    Постоянно сталкиваюсь с необходимостью проверки существования строк.

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

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

    Можно ли эти 3 операции свести к одному mysql запросу? Или как оптимизировать такие действия?
    Может функцию в mysql прописывать или триггер какой-нибудь (ни с тем ни сдругим дела не имел)?
     
  2. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    есть такой синтакс
    INSERT ... ON DUPLICATE KEY UPDATE
    http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
    подойдёт например когда есть уникальное поле, если значение такого поля есть то обновляется, если нет то добавляется
     
    dandandan и p1kka нравится это.
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    К сожалению, поля неуникальные. В таблице 3 поля, по которым делается выборка и четвертое поле для вставки значения. Вот если сразу 3 поля взять, то будет уникальным этот блок из трех полей. Как я понимаю ON Duplicate KEY не работает так. В мануале не написано ничего про этот случай.

    Может какая-нибудь связка через IF в mysql запросе возможна ? Что-то вроде IF(SELECT count(id) FROM... =1, UPDATE..., INSERT...)
     
  4. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    так поцепи на все 3 поля уникальный ключ
    в любом случае это будет только плюсом при поиске
    да и ON Duplicate KEY будет работать

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

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    Не могут значения в этих полях быть уникальными, к сожалению. Только если все три поля слепить воедино, но тогда поиск неудобно будет делать из другого запроса.
     
  6. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    я говорю сделать уникальным не каждое из трех полей по отдельности, а все три поля сразу в виде одной уникальной связки

    Код:
    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. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    т.е. фактически эти поля будут независимы и разделены друг от друга
    но в пределах индекса ( ключа ) они будут "слиты воедино"
     
  8. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    Понял, еще 2 вопроса.
    Обязательно тип innodb? и название индекса UK_t2 как-то будет влиять на текст запроса, как в примере по ссылке выше?
    Тут вроде бы индексы нигде не указываются
     
  9. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    тип innodb не обязательно
    название индекса используют лишь для тестирования скорости работы запросов ( чтоб видеть где какой индекс юзается ) так что на сам запрос оно никак не повлияет и может быть любым

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

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    Еще вопросик возник в phpmyadmin при создании индекса можно указать видимо его рамер

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