Зафиксируйте записи дубликата DB (ошибка MySQL)

Я использую MySQL 4.1. Некоторые таблицы имеют записи дубликатов, которые идут вразрез с ограничениями.

Когда я пытаюсь сгруппировать строки, MySQL не распознает строки, как являющиеся подобным.

Пример:

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

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

В теории я мог попытаться импортировать, ожидать первой ошибки, исправить сценарий импорта и исходный DB и повторение. В практике, которая взяла бы навсегда.

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

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

1
задан Philippe Carriere 16 February 2010 в 15:26
поделиться

4 ответа

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

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

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

0
ответ дан 3 September 2019 в 01:12
поделиться

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

0
ответ дан 3 September 2019 в 01:12
поделиться

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

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

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

См. этот SO вопрос, чтобы узнать, как удалить их из таблицы.

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

-- 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;
2
ответ дан 3 September 2019 в 01:12
поделиться

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

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

Вы увидите ascii код этого "квадрата".

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

UPDATE TableName SET Name=TRIM(TRAILING 'x' FROM Name);
0
ответ дан 3 September 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: