@mir546
creator

INSERT и IF. Как правильно?

Есть таблица table. Три поля: autoincrement, two, three.
Нужно добавить строку со значениями в полях two, three если её нет в этой таблице.
Думал использовать ignore, но там первое поле autoincrement, а в two, three есть повторяющиеся элементы поэтому сделать их PRIMARY или UNIQUE нельзя.

Спустя 2-3 часа попыток, пришел к такому коду:
SELECT IF((SELECT three FROM table WHERE two='100' AND three='1') IS NULL,  @res:=1, 0) RES;
INSERT INTO table (two, three) (SELECT '100','1' FROM table  WHERE @res=1  LIMIT 1)


Возможны ли варианты более адекватные? Или мой код вполне неплох?

#UPD:
Ещё вариант с использованием переменной
SELECT @res:=autoincrement FROM table WHERE two=46 AND three=24;
INSERT IGNORE INTO table  (autoincrement,two, three) VALUES (@res, 46, 24)

Но в предыдущем варианте INSERT выполняется в 2-3 раза быстрей
  • Вопрос задан
  • 304 просмотра
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А кто мешает сделать составной уникальный ключ UNIQUE KEY `two_three` (`two`, `three`)
PS. Ну или как-то так:
INSERT INTO `table` (`two`, `three`)
  SELECT `t1`.`two`, `t1`.`three`
    FROM (
      SELECT :two AS `two`, :three AS `three`
    ) AS `t1`
    LEFT JOIN `table` AS `t2` USING (`two`, `three`)
    WHERE `t2`.`two` IS NULL;
Ответ написан
martin74ua
@martin74ua Куратор тега MySQL
Linux administrator
а назначить полям two и three значения по умолчанию нельзя? или есть какая то зависимость?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы