За последние 24 часа нас посетили 22225 программистов и 1070 роботов. Сейчас ищут 609 программистов ...

Задачка на вставку уникального значения

Тема в разделе "MySQL", создана пользователем artoodetoo, 12 авг 2020.

  1. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    У нас нет уникального индекса по полю, но хочется либо вставить строку с новым уникальным значением поля, либо обломаться. Причем хочется сделать это в одну операцию INSERT. Без предварительного SELECT и участия PHP.

    Пусть есть таблица test(id, code, name) где id автоинкремент. и мы делаем
    Код (SQL):
    1. INSERT INTO test(code, name) VALUES('xyz', 'John')
    как НЕ вставить лишний раз 'xyz' ?
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Например:
    Код (Text):
    1. insert into test(`code`, `name`) select 'xyz', 'John' where not exists (select id from test where `code` = 'xyz');
     
    Deonis и artoodetoo нравится это.
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    А так можно, без from но при этом с where?
    Надо проверить.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.820
    Симпатии:
    736
    Адрес:
    Татарстан
    А может все же правильнее сделать индекс и insert duplicate update
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.790
    Симпатии:
    649
    @ADSoft, ТСу не нужен UPDATE. Про уник. индекс согласен. По уму задача решается уником с INSERT IGNORE, но artoodetoo написал, что уника нет. Видимо, его создание не представляется возможным. Хотя я и не понимаю, зачем нужны подобные ограничения, но встревать со своими непонятками не буду :)
     
    artoodetoo нравится это.
  6. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Нельзя.
    @Sail просто забыл вписать "from dual".
     
    artoodetoo и Deonis нравится это.
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Спасибо. Сейчас кажется странным, что я сам не подумал про NOT EXISTS :) Это годное решение.

    Я в курсе про индексы и INSERT IGNORE. Тут специфический случай. Просто не хотел грузить вас лишними подробностями в ТЗ :)
    На самом деле колонка не может быть уникальной т.к. уже содержит повторы. Но мы не должны добавлять новое неуникальное значение в своём инсерте.
     
  8. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Увы, не забыл и даже проверил работоспособность запроса. Правда лишь для mysql, где даже в описании выражения select и from и where находятся на одном уровне и оба необязательны.
    :rolleyes:
     
  9. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Ха! Точно не нужно, если INSERT.
    А без него требуется.

    Добавлю в копилку тонкостей движка.
     
    #9 Chushkin, 13 авг 2020
    Последнее редактирование: 13 авг 2020