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

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

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

    dandandan

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

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

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

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

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

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    есть такой синтакс
    INSERT ... ON DUPLICATE KEY UPDATE
    Перейти по ссылке
    подойдёт например когда есть уникальное поле, если значение такого поля есть то обновляется, если нет то добавляется
     
    dandandan и p1kka нравится это.
  3. dandandan

    dandandan

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

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

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    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
    Сообщения:
    991
    Симпатии:
    267
    Не могут значения в этих полях быть уникальными, к сожалению. Только если все три поля слепить воедино, но тогда поиск неудобно будет делать из другого запроса.
     
  6. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    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
    Сообщения:
    363
    Симпатии:
    117
    т.е. фактически эти поля будут независимы и разделены друг от друга
    но в пределах индекса ( ключа ) они будут "слиты воедино"
     
  8. dandandan

    dandandan

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

    chang

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

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

    dandandan

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

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