Удаление дублей в БД

243
02 мая 2017, 05:36

Всем привет. Знаю, что тема заезженная, но решить поставленную задачу не смог.

Суть в чем:

Имеется таблица с перечнем фруктов/овощей которая имеет 4 поля (ID, Name, List, Quantity).

  1. В поле Name заносится название фрукта/овоща.
  2. В List состояние фрукта (зеленый, спелый, переспелый...)
  3. В Quantity количество фрукта/овоща в наличии

Так, как у нас состояний несколько, поле Name может повторяться:

Таблица №1

+--------+---------+-----------+----------+
|     id |   Name  |    List   | Quantity |
+--------+---------+-----------+----------+
|     1  | Яблоко  |  Зеленый  |    100   |
+--------+---------+-----------+----------+
|     2  | Яблоко  |  Спелый   |    40    |
+--------+---------+-----------+----------+
|     3  | Яблоко  | Переспелый|     3    |
+--------+---------+-----------+----------+

Все было хорошо, но в один прекрасный день, что-то пошло не так, часть полей продублировались и получилось:

Таблица №2

+--------+---------+-----------+----------+
|     id |   Name  |    List   | Quantity |
+--------+---------+-----------+----------+
|     1  | Яблоко  |  Зеленый  |    100   |
+--------+---------+-----------+----------+
|     2  | Яблоко  |  Спелый   |    40    |
+--------+---------+-----------+----------+
|     3  | Яблоко  | Переспелый|     3    |
+--------+---------+-----------+----------+
|     4  | Яблоко  |  Зеленый  |    100   |
+--------+---------+-----------+----------+
|     5  | Яблоко  |  Спелый   |    40    |
+--------+---------+-----------+----------+
|     6  | Яблоко  | Переспелый|     3    |
+--------+---------+-----------+----------+
|     7  | Яблоко  |  Зеленый  |    100   |
+--------+---------+-----------+----------+
|     8  | Яблоко  |  Спелый   |    40    |
+--------+---------+-----------+----------+
|     9  | Яблоко  | Переспелый|     3    |
+--------+---------+-----------+----------+

Из за того, что поле Name не уникально, БД позволила создать дубликаты.

Теперь собственно вопрос, каким образом можно удалить задублированные поля List и Quantity, что бы получилось как в Таблице №1 ?

Answer 1

Для начала удалите дубли в таблице:

DELETE t1
FROM tbl AS t1
INNER JOIN tbl AS t2 ON t1.Name = t2.Name
            AND t1.List = t2.List
            AND t1.Quantity = t2.Quantity
            AND t1.id > t2.id;

tbl — имя вашей таблицы.

Во избежание таких ситуаций, сделайте составной уникальный индекс по полям Name, List, Quantity:

CREATE UNIQUE INDEX index_name ON tbl (Name, List, Quantity);

index_name название индекса, а tbl ваша таблица.

READ ALSO
отправка почты с андроида без клиента (Sending Emails without User Intervention (no Intents) in Android)

отправка почты с андроида без клиента (Sending Emails without User Intervention (no Intents) in Android)

Нашел много примеров по теме (Sending Emails without User Intervention (no Intents) in Android) с отправкой сообщения на почту анонимно с сотового из своего приложения...

253
Клиент-сервер. JAVA

Клиент-сервер. JAVA

Здравствуйте! Пытаюсь сделать клиент-серверное приложение, но не могу разобраться, почему клиент не обрабатывает команды посланные сервером,...

336
XML Parser. NumberFormatException на ровном месте

XML Parser. NumberFormatException на ровном месте

Есть метод, который получает элементы xmlparsers:

222
Ограничить длину дробной части в строке с помощью Stream API

Ограничить длину дробной части в строке с помощью Stream API

Мне необходимо ограничить количество символов в строке после '' до 6

210