Исправление дублирующих записей БД (ошибка MySQL) - PullRequest
1 голос
/ 16 февраля 2010

Я использую MySQL 4.1. В некоторых таблицах есть записи-дубликаты, которые идут против ограничений.

Когда я пытаюсь сгруппировать строки, MySQL не распознает строки как похожие.

Пример:

В таблице A есть столбец «Имя» с уникальным свойством.
Таблица содержит одну строку с именем 'Hach?' и один ряд с тем же именем, но с квадратом в конце вместо '?' (который я не могу воспроизвести в этом текстовом поле)
«Группировка по» в этих 2 строках возвращает 2 отдельные строки

Это вызывает несколько проблем, включая тот факт, что я не могу экспортировать и повторно импортировать базу данных. При повторном импорте ошибки упоминается, что вставка не удалась, поскольку она нарушает ограничение.

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

Есть ли способ перечислить все аномалии или заставить базу данных перепроверить ограничения (и перечислить все значения / строки, которые идут против них)?

Я могу предоставить файл .MYD, если это может быть полезно.

Ответы [ 4 ]

2 голосов
/ 16 февраля 2010

Чтобы перечислить все аномалии:

SELECT name, count(*) FROM TableA GROUP BY name HAVING count(*) > 1;

Есть несколько способов решить проблему удаления дупов, и ваш путь будет сильно зависеть от количества ваших дуплей.

См. этот ТАК вопрос о способах их удаления из вашей таблицы.

Вот решение, которое я там предоставил:

-- Setup for example
create table people (fname varchar(10), lname varchar(10));

insert into people values ('Bob', 'Newhart');
insert into people values ('Bob', 'Newhart');
insert into people values ('Bill', 'Cosby');
insert into people values ('Jim', 'Gaffigan');
insert into people values ('Jim', 'Gaffigan');
insert into people values ('Adam', 'Sandler');

-- Show table with duplicates
select * from people;

-- Create table with one version of each duplicate record
create table dups as 
    select distinct fname, lname, count(*) 
    from people group by fname, lname 
    having count(*) > 1;

-- Delete all matching duplicate records
delete people from people inner join dups 
on people.fname = dups.fname AND 
   people.lname = dups.lname;

-- Insert single record of each dup back into table
insert into people select fname, lname from dups;

-- Show Fixed table
select * from people;
0 голосов
/ 29 марта 2010

Я предполагаю, что это случайная ошибка MySQL 4.1. Некоторые значения просто изменяются сами по себе без особой причины, даже если они нарушают некоторые ограничения MySQL. MySQL просто игнорирует эти нарушения.

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

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

0 голосов
/ 25 февраля 2010

Чтобы узнать, что это за символ, выполните следующий запрос:

SELECT HEX(Name) FROM TableName WHERE Name LIKE 'Hach%'

Вы выберете ascii-код этого «квадрата».

Если этот символ 'x', вы можете обновить его так: (но если этот столбец уникален, у вас будут ошибки)

UPDATE TableName SET Name=TRIM(TRAILING 'x' FROM Name);
0 голосов
/ 16 февраля 2010

Создайте новую таблицу, выделите все строки и группы по уникальному ключу (в имени столбца примера) и вставьте в новую таблицу.

...