Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Удалить "копию" записи из БД
 
 автор: Zilog   (22.07.2014 в 03:12)   письмо автору
 
 

Братцы, затупил к ночи.
Есть в БД две записи

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

собсно, возникает вопрос, как удалить дубликаты?

  Ответить  
 
 автор: Igorek   (22.07.2014 в 09:49)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Zilog   (22.07.2014 в 13:12)   письмо автору
 
   для: Igorek   (22.07.2014 в 09:49)
 

Спасибо, Игорёк.

По ходу ещё вопрос возник. Конкретно у меня к записи могут быть привязаны данные из другой таблицы. Можно ли как то отдать предпочтение какую копию удалять?

  Ответить  
 
 автор: Igorek   (23.07.2014 в 10:51)   письмо автору
 
   для: Zilog   (22.07.2014 в 13:12)
 

Написать за 10 минут один раз небольшой скриптик, который почистит дубликаты и после этого добавить unique ключик на необходимые поля, чтобы подобной проблемы больше не возникало?
Задача как я понимаю единовременная - не обязательно все одним запросом делать

  Ответить  
 
 автор: Zilog   (24.07.2014 в 12:29)   письмо автору
 
   для: Igorek   (23.07.2014 в 10:51)
 

>Написать за 10 минут один раз небольшой скриптик, который почистит дубликаты и после этого добавить unique ключик на необходимые поля, чтобы подобной проблемы больше не возникало?
>Задача как я понимаю единовременная - не обязательно все одним запросом делать

да, единовременная. так и сделал, в цикле. просто стало интересно, а вдруг какие-то интересные и новые для меня решения существуют.
Кстати, а как unique ключ может спасти от возникновения подобных ситуаций?

  Ответить  
 
 автор: Igorek   (24.07.2014 в 13:44)   письмо автору
 
   для: Zilog   (24.07.2014 в 12:29)
 

ALTER TABLE test ADD UNIQUE KEY `uk_test` (value1, value2);

и СУБД не даст добавить новую/изменить существующую строку, если в таблице уже есть такая пара значений value1 и value2

  Ответить  
 
 автор: Zilog   (25.07.2014 в 00:35)   письмо автору
 
   для: Igorek   (24.07.2014 в 13:44)
 

фокус в том, что подобная пара может быть привязана к другому объекту.
Я в примере эту связь не отобразил, но там ещё один столбец как раз за это отвечает.

А вообще, большое спасибо за ценный совет.
Хотя... выходит, если на все поля кроме ИД добавить UNIQUE вопрос решится должным образом, так ведь?

  Ответить  
 
 автор: Igorek   (25.07.2014 в 11:08)   письмо автору
 
   для: Zilog   (25.07.2014 в 00:35)
 

Со стороны СУБД да - будет обеспечена уникальность данных. Можно конечно вместо этого пересмотреть логику приложения и добавлять данные только убедившись заранее, что дубликатов нет. С другой стороны, в таком случае возможна ситуация конкурирущих запросов, когда в один момент времени выполняется два одинаковых запроса - оба получают ответ, что дубликатов нет, записываются данные и получаем дубли. Конечно, есть способы предотвращения таких ситуаций, но проще всего доверить это дело СУБД и пользовать INSERT IGNORE, например.

  Ответить  
 
 автор: Zilog   (25.07.2014 в 12:10)   письмо автору
 
   для: Igorek   (25.07.2014 в 11:08)
 

Благодарю за развёрнутый ответ. Большое спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования