|
|
|
| Братцы, затупил к ночи.
Есть в БД две записи
id.........value1........value2
1.............100...............200
2.............100...............200
3.............100...............200
4.............ААА...............ААА
5.............333...............444
6.............333...............444
для имеющейся задачи эти записии являются копиями, т.к. нужные значения идентичны.
Как бы удалить одну из них?
select t1.*
from test t1
where exists (select *
from test t2
where t2.id <> t1.id
and t2.date = t1.date
and t2.operator_id = t1.operator_id)
|
Приведенный код выдаст:
id.........value1........value2
1.............100...............200
2.............100...............200
3.............100...............200
5.............333...............444
6.............333...............444
собсно, возникает вопрос, как удалить дубликаты? | |
|
|
|
|
|
|
|
для: Zilog
(22.07.2014 в 03:12)
| |
DELETE me
FROM test me, test clone
WHERE me.value1 = clone.value1 AND me.value2 = clone.value2 AND me.id > clone.id
|
еще варианты: https://toster.ru/q/1708 | |
|
|
|
|
|
|
|
для: Igorek
(22.07.2014 в 09:49)
| | Спасибо, Игорёк.
По ходу ещё вопрос возник. Конкретно у меня к записи могут быть привязаны данные из другой таблицы. Можно ли как то отдать предпочтение какую копию удалять? | |
|
|
|
|
|
|
|
для: Zilog
(22.07.2014 в 13:12)
| | Написать за 10 минут один раз небольшой скриптик, который почистит дубликаты и после этого добавить unique ключик на необходимые поля, чтобы подобной проблемы больше не возникало?
Задача как я понимаю единовременная - не обязательно все одним запросом делать | |
|
|
|
|
|
|
|
для: Igorek
(23.07.2014 в 10:51)
| | >Написать за 10 минут один раз небольшой скриптик, который почистит дубликаты и после этого добавить unique ключик на необходимые поля, чтобы подобной проблемы больше не возникало?
>Задача как я понимаю единовременная - не обязательно все одним запросом делать
да, единовременная. так и сделал, в цикле. просто стало интересно, а вдруг какие-то интересные и новые для меня решения существуют.
Кстати, а как unique ключ может спасти от возникновения подобных ситуаций? | |
|
|
|
|
|
|
|
для: Zilog
(24.07.2014 в 12:29)
| |
ALTER TABLE test ADD UNIQUE KEY `uk_test` (value1, value2);
|
и СУБД не даст добавить новую/изменить существующую строку, если в таблице уже есть такая пара значений value1 и value2 | |
|
|
|
|
|
|
|
для: Igorek
(24.07.2014 в 13:44)
| | фокус в том, что подобная пара может быть привязана к другому объекту.
Я в примере эту связь не отобразил, но там ещё один столбец как раз за это отвечает.
А вообще, большое спасибо за ценный совет.
Хотя... выходит, если на все поля кроме ИД добавить UNIQUE вопрос решится должным образом, так ведь? | |
|
|
|
|
|
|
|
для: Zilog
(25.07.2014 в 00:35)
| | Со стороны СУБД да - будет обеспечена уникальность данных. Можно конечно вместо этого пересмотреть логику приложения и добавлять данные только убедившись заранее, что дубликатов нет. С другой стороны, в таком случае возможна ситуация конкурирущих запросов, когда в один момент времени выполняется два одинаковых запроса - оба получают ответ, что дубликатов нет, записываются данные и получаем дубли. Конечно, есть способы предотвращения таких ситуаций, но проще всего доверить это дело СУБД и пользовать INSERT IGNORE, например. | |
|
|
|
|
|
|
|
для: Igorek
(25.07.2014 в 11:08)
| | Благодарю за развёрнутый ответ. Большое спасибо. | |
|
|
|