2010-02-16 2 views
1

Я использую MySQL 4.1. В некоторых таблицах есть записи дубликатов, которые противоречат ограничениям.Fix DB duplicate entries (MySQL bug)

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

Пример:

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

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

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

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

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

+0

Если два имени не равны, они не нарушают дублирующее ограничение. Я не следую за твоим здесь. Если это поврежденные данные, вы должны исправить это. – crunchdog

+0

Они равны, когда я экспортирую и повторно импортирую данные. «Если это данные, которые повреждены, вы должны исправить это». Как найти поврежденные данные? Я не могу найти квадрат. –

+0

Прошу прощения, если мое описание неточно, но проблема действительно странная. –

ответ

0

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

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

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

2

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

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

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

См. this ВОПРОС О способах удаления данных из вашего стола.

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

-- 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

Первый запрос ничего не возвращает. Эта проблема имеет две таблицы. Не работает ни с ними, ни с ними. В одном дубликате я могу идентифицировать там какой-то характер, который отличается. Однако, когда он пытается вставить, MYSQL находит, что это тот же самый caracter. Я обновлю свое описание. –

+0

Вы проверили, чтобы убедиться, что в ваших значениях столбцов нет пробелов? Я предполагаю, что у вас есть такая ценность, как «Боб» и «Боб». –

+0

Это не пробелы. –

0

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

+0

Хм, как получить негруппированные значения ... – crunchdog

+0

«Группировать по» не работает. Я редактировал свой вопрос. –

0

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

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

Вы будете С.Е. ASCii код, что «квадрат».

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

UPDATE TableName SET Name=TRIM(TRAILING 'x' FROM Name); 
+0

Да, спасибо. К сожалению, у меня есть сотни подобных дел, и только один из них начинается с «Hach». Как их найти? –

+0

Но последний символ («квадрат») тот же? –

+0

Квадрат не всегда является последним персонажем и может быть больше 1. Они, кажется, заменяют акценты словами: язык французский, и много слов имеют акценты. С другой стороны, некоторые акценты не заменяются «квадратами». –