За последние 24 часа нас посетили 17978 программистов и 1612 роботов. Сейчас ищут 969 программистов ...

Как сделать одним запросом?

Тема в разделе "MySQL", создана пользователем inline, 26 ноя 2010.

  1. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    update table set .... where id=777
    если такой записи c id=777 нет, то
    insert into table values ('777',....

    Как можно одним запросом?
     
  2. kotyara

    kotyara Активный пользователь

    С нами с:
    17 фев 2010
    Сообщения:
    163
    Симпатии:
    0
    что то вроде этого по моему
    [sql]IF NOT EXISTS( select)
    begin
    insert...
    end
    else
    begin
    update...
    end[/sql]
     
  3. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    REPLACE вместо INSERT иногда делают.
     
  4. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Ещё вроде подойдёт
    [sql]insert into table .... ON duplicate KEY update [/sql]
     
  5. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    счас так и делаю, но такая конструкция тормозит
    нужно наоборот сначала апдейтить, а если нет записи, то вставлять
     
  6. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    что это мне даст?
    п/с либо не понимаю как прикрутить к моей проблеме
     
  7. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    мускул сначала пробует вставить или проверяет duplicate KEY?
    подозреваю, что сначала пробует вставить, потому и тормозят такие вставки
     
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Не знаю почему у тебя тормозит, мне рекомендовали пару лет назад именно так делать... Может чё не так с базой ?
     
  9. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    а что может быть не так?
     
  10. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Не знаю, индексы всякие итд... Что-то слишком подозрительно чтоб такой запрос простой и тормозил...

    Имеет смысл попробовать также в 2 запроса (это конечно не самое красивое решение, но если оно сработает то почему бы и нет ?)
     
  11. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    индексы есть
    id UNIQUE
    name INDEX

    может перед вставкой оставлять индекс только по id ?


    ON duplicate KEY на какой KEY он смотрит?
     
  12. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    запрос то не один
    около 300к
     
  13. Mat

    Mat Активный пользователь

    С нами с:
    12 дек 2006
    Сообщения:
    391
    Симпатии:
    0
    ОМГ! Я не ослышался ??? 300 тысяч???
     
  14. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Ну норм. а на 300к - долгая вставка это вполне нормальное явление. Особенно когда UNIQUE ключ есть. А задача - этот запрос разово сделать?
     
  15. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    Задача сделать вставку без напряга процесора в 100%
     
  16. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    inline через консоль сделай
     
  17. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    мне нужно средствами пхп
    а через консоль это как?
     
  18. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    хостинг?
    или нечто другое?
     
  19. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    vds от фирстов
     
  20. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    inline
    Сделайте двумя "запросами" - один со всеми INSERT IGNORE, второй - со всеми UPDATE-ами.
    Вообще, не вижу проблемы, тем более если VDS.
     
  21. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    Dagdamor
    пробовал уже всякими разными способами
    делов том, что вставка в таблицу загружает проц на 100%
    почему и как исправить?
     
  22. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    inline
    1. Конкуррентность (добавляешь, а в то же время другие процессы лезут в таблицу за данными). Решение - LOCK TABLES.
    2. Много индексов, и тормозит их обновление. Решение 1 - временно отключать обновление индексов (не помню как), решение 2 - использовать "пакетные" вставки - INSERT INTO ... VALUES (...), (...), (...)...
     
  23. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    исключено. создается временная таблица тупо для вставок (потом она переименовывается в робочую)
    Индексов два
    уникальный по name (varchar 255) и просто индекс по id


    буду пробовать решения из второго пункта твоего поста
    спасибо!