с редизайном:
Вы можете изменить макет примерно так:
| id | item |
При наличии (id, item) в качестве первичного ключа это запрещает иметь дважды одинаковые item
для данного id
.
Таким образом, данные будут выглядеть так:
| id | item |
| 1 | red |
| 1 | blue |
...
Попытка вставить | 1 | red |
снова приведет к ошибке.
Без перепроектирования:
Если вы не хотите изменять макет, этот запрос найдет строки, в которых одно из полей fieldX
равно другому fieldX
из той же строки:
SELECT t.id FROM (select 1) dummy
JOIN (SELECT id, item1 as item FROM table
UNION SELECT id, item2 as item FROM table
UNION SELECT id, item3 as item FROM table
UNION SELECT id, item4 as item FROM table
UNION SELECT id, item5 as item FROM table) t
GROUP BY t.id
HAVING count(*) < 5
(Предполагается, что у вас есть 5 из этих fieldX
столбцов.)
Это фактически подсчитывает различные значения fieldX
для каждого id
. Если количество отличается от количества полей, то есть дубликат. Запрос возвращает идентификаторы строк, в которых есть дубликат.
После тестирования вы можете удалить строки с помощью
DELETE FROM table WHERE id IN ( <the previous query here> )