Удалите повторяющиеся записи из MySQL без применения уникального ключа - PullRequest
0 голосов
/ 25 апреля 2018

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

Кто-то обновил код создания пользователя 2 дня назад, что привело к появлению огромного количества дубликатов (буквально тысячи). Мне нужно удалить все дубликаты за последние 2 дня. Я не могу использовать «подход с уникальным ключом», потому что к старым дубликатам прикреплены данные (бронирование и т. Д.). У кого-нибудь есть идеи, как решить такую ​​проблему? Я явно хочу удалить дубликаты только за последние 2 дня, оставив по 1 копии каждого человека в таблице. CREATE TABLE IF NOT EXISTS `people_copy` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `company_id` int(11) NOT NULL, `firstname` char(255) COLLATE utf8_unicode_ci NOT NULL, `lastname` char(255) COLLATE utf8_unicode_ci NOT NULL, `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `mobile` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `birthdate` date DEFAULT NULL, `birthplace` char(255) COLLATE utf8_unicode_ci NOT NULL, `birth_country` char(255) COLLATE utf8_unicode_ci NOT NULL, `blocked_from` date DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=42095 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Проверка наличия дубликатов записей может быть завершена с помощью столбцов: имя, фамилия, дата рождения, место рождения, страна рождения

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018
DELETE MAIN_TABLE
FROM people_copy as CHILD, people_copy as MAIN_TABLE
WHERE
          (CHILD.company_id   = MAIN_TABLE.company_id OR CHILD.company_id IS NULL AND MAIN_TABLE.company_id IS NULL)
      AND (CHILD.firstname = MAIN_TABLE.firstname OR CHILD.firstname IS NULL AND MAIN_TABLE.firstname IS NULL)
      AND (CHILD.lastname = MAIN_TABLE.lastname OR CHILD.lastname IS NULL AND MAIN_TABLE.lastname IS NULL)
      AND CHILD.ID < MAIN_TABLE.ID AND CHILD.created_at > DATE_ADD(SYSDATE(),INTERVAL -2 DAY);

Здесь вы можете самостоятельно присоединиться к этой таблице и сравнить, сколько столбцов вы хотите сравнить. Это поможет вам. You can check SQL Fiddle demo

0 голосов
/ 25 апреля 2018

В этом случае вы можете создать другую таблицу с той же схемой и создать объединенный уникальный столбец в этой таблице из следующих столбцов: firstname, lastname, birthdate, birthplace, birth_country.

Теперь вы можете записывать данные из первой таблицы в новую таблицу с помощью хранимой процедуры или пользовательской программы. После этого удалите данные за 2 дня из старой таблицы и сохраните данные из новой таблицы в старую таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...