[MySQL] Записать уникальную строку.

Тема в разделе "Базы данных", создана пользователем javx, 1 янв 2016.

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

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    244
    Здравствуйте, подскажите как записать условие - записать строку если такой нет в db.
    Вид таблицы id | id_cat | id_tovar
    1 | 1 | 123
    2 | 1 | 124
    ...
    Что бы запись выполнялась, только если нет строки с id_cat | id_tovar == 1 | 124
    Для избежания дубликатов.
    Если непонятно объяснил, напишите что именно, я постараюсь описать подробнее.
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.116
    Симпатии:
    2.131
    Вариант первый:
    1) Вешаем индекс UNIQUE
    2) Делаем INSERT IGNORE INTO

    Вариант второй:
    1) Делаем SELECT и проверяем наличие такой строки
    2) Если строки нет - запихиваем, если есть - возвращаем ошибку
     
    latteo нравится это.
  3. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    244
    первый не подходит, а второй - можно ли в одном запросе выполнить?
     
  4. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.116
    Симпатии:
    2.131
    Простите, а чем первый вариант не подходит?

    Второй вариант должен быть на стороне приложения.
     
  5. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    244
    Первый не подходит, по тому что например 1 товар находится в нескольких категориях. т.е уникальные значения должны быть у связи товар -категория, а не в пределах столбца. Второй вариант я думал что можно решить SQL условиями if()...
     
  6. ykpon

    ykpon

    Регистр.:
    8 дек 2012
    Сообщения:
    248
    Симпатии:
    143
    if($mysqli->query("SELECT COUNT(id) FROM table WHERE id_cat=$cat AND id_tovar=$tovar") > 1) {
    // не уник
    } else {
    // уник
    }
     
  7. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.116
    Симпатии:
    2.131
    Тут проще сделать ещё одну колонку, присвоить ей значение товар_категория - и сделать уникальный индекс.
     
  8. mrakobes0001

    mrakobes0001 Создатель

    Регистр.:
    6 фев 2013
    Сообщения:
    33
    Симпатии:
    17
    частично соглашусь с предыдущем коментатором по поводу уникальной колонки
    единственное что записывать туда можно сразу хеш (мд5) - результата конкатенациии всех ячеек в строке
    таким образом будет уникальный ключ по которому легко отличать одинаковые записи в базе
     
  9. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.116
    Симпатии:
    2.131
    @mrakobes0001
    Согласился бы, но... Я предложил именно товар_категория, ибо функция конкатенации явно быстрее, чем конкатенация + MD5... А выигрыша по объёму тут не будет, т.к. речь идёт не о названии товаров, а только об ID.
    Кроме того, MD5 - функция хеширования... Её можно использовать как контроль целостности, т.к. шанс, что схожие данные будут иметь один хеш, близок к нулю. А вот как уникальный идентификатор я бы всё же не стал, т.к. 2 строки могут иметь одинаковый хеш...

    Кстати, об этом же говорит RFC 6151
     
  10. bibika

    bibika Создатель

    Регистр.:
    30 янв 2016
    Сообщения:
    8
    Симпатии:
    1
    А чем конструкция REPLACE INTO не устраивает?

    // Оператор REPLACE работает точно так же, как INSERT, за исключением того, что если старая запись в данной таблице имеет то же значение индекса UNIQUE или PRIMARY KEY, что и новая, то старая запись перед занесением новой будет удалена

    Т.е. дублей точно не будет)