ФорумРазработкаБазы данных → IF в MySQL

IF в MySQL

  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 19 марта 2013 г. 23:43

    Привет всем. Подскажите как правильно будет решить такую задачу:
    Нужно составить большой запрос к MySQL.
    Там добавляются значения. И возникла проблема:
    если значение есть то берем его ID если нет, то вставляем и берем его ID.
    Нужно что то типа:

    IF EXISTS(SELECT id FROM grs2cats WHERE grs_names_id = @grs_id) THEN
    SET @grs2cats_lastID := (SELECT id FROM grs2cats WHERE grs_names_id = @grs__id);
    ELSE
    INSERT INTO grs2cats SET grs_names_id = @grs_id;
    SET @grs2cats_lastID := LAST_INSERT_ID();
    END IF;


    Как бы мне не нравится то что идет 2 запроса селект при проверке и при получении.
    Как правильно?
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 20 марта 2013 г. 0:00, спустя 17 минут 11 секунд

    Наверно лучше так:
    SET @grs2cats_lastID := (SELECT id FROM grs2cats WHERE grs_names_id = @grs__id)
    IF @grs2cats_lastID=NULL  THEN
    INSERT INTO grs2cats SET grs_names_id = @grs_id;
    @grs2cats_lastID := LAST_INSERT_ID();
    END IF;
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 20 марта 2013 г. 0:19, спустя 18 минут 59 секунд

    почему не сразу INSERT ... SELECT ?
    и, кстати, для проверки на нулл правильный синтаксис "x IS NULL" и есть функция IFNULL(x, value)
    ιιlllιlllι унц-унц
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 20 марта 2013 г. 0:25, спустя 6 минут 8 секунд

    INSERT … SELECT INSERT … SELECT , вы можете быстро вставить множество строк в таблицу из одной или нескольких таблиц.
    Мне как бы не это нужно. Мне нужно ID определенной строки. Если строки нет, то нужно добавить и взять ID, если есть то просто взять ID и больше ничего не делать.

    За IS NULL  и IFNULL спасибо. Вопрос еще один возник. Если SELECT ничего не нашел, то вернет NULL?
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 20 марта 2013 г. 7:06, спустя 6 часов 40 минут 15 секунд

    А, вон чо!
    Тогда просто пытайся её вставить. Если это поле уникально проиндексировано (а оно блять обязано быть уникально проиндексировано!), то просто вставится строго один раз.
    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 20 марта 2013 г. 7:16, спустя 9 минут 55 секунд

    Если SELECT ничего не нашел, то вернет NULL?

    он вернет пустое множество.
    в твоём случае после SET@x:=(SELECT ….), если не найдено, @x будет содержать NULL
    а IF @x = NULL вроде по теории никогда не сработает в истину ))) т.к. любая операция с NULL возвращает NULL. исключение операция IS NULL:
    IF @x IS NULL
    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 20 марта 2013 г. 7:23, спустя 7 минут 14 секунд

    Вот точно для тебя инфа: MySQL ON DUPLICATE KEY - last insert id?
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!