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

javx

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

Вариант второй:
1) Делаем SELECT и проверяем наличие такой строки
2) Если строки нет - запихиваем, если есть - возвращаем ошибку
 
Вариант первый:
1) Вешаем индекс UNIQUE
2) Делаем INSERT IGNORE INTO

Вариант второй:
1) Делаем SELECT и проверяем наличие такой строки
2) Если строки нет - запихиваем, если есть - возвращаем ошибку
первый не подходит, а второй - можно ли в одном запросе выполнить?
 
Простите, а чем первый вариант не подходит?

Второй вариант должен быть на стороне приложения.
 
Простите, а чем первый вариант не подходит?

Второй вариант должен быть на стороне приложения.
Первый не подходит, по тому что например 1 товар находится в нескольких категориях. т.е уникальные значения должны быть у связи товар -категория, а не в пределах столбца. Второй вариант я думал что можно решить SQL условиями if()...
 
if($mysqli->query("SELECT COUNT(id) FROM table WHERE id_cat=$cat AND id_tovar=$tovar") > 1) {
// не уник
} else {
// уник
}
 
Тут проще сделать ещё одну колонку, присвоить ей значение товар_категория - и сделать уникальный индекс.
 
частично соглашусь с предыдущем коментатором по поводу уникальной колонки
единственное что записывать туда можно сразу хеш (мд5) - результата конкатенациии всех ячеек в строке
таким образом будет уникальный ключ по которому легко отличать одинаковые записи в базе
 
@mrakobes0001
Согласился бы, но... Я предложил именно товар_категория, ибо функция конкатенации явно быстрее, чем конкатенация + MD5... А выигрыша по объёму тут не будет, т.к. речь идёт не о названии товаров, а только об ID.
Кроме того, MD5 - функция хеширования... Её можно использовать как контроль целостности, т.к. шанс, что схожие данные будут иметь один хеш, близок к нулю. А вот как уникальный идентификатор я бы всё же не стал, т.к. 2 строки могут иметь одинаковый хеш...

Кстати, об этом же говорит Для просмотра ссылки Войди или Зарегистрируйся
 
А чем конструкция REPLACE INTO не устраивает?

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

Т.е. дублей точно не будет)
 
Назад
Сверху