修复数据库重复条目(MySQL错误)

时间:2010-02-16 14:24:49

标签: mysql duplicates

我正在使用MySQL 4.1。某些表具有违反约束条件的重复条目。

当我尝试对行进行分组时,MySQL不会将这些行识别为相似。

示例:

表A有一个具有唯一属性的“名称”列 该表包含一行名为'Hach?'的行并且一行具有相同的名称,但最后是一个正方形而不是'?' (我无法在此文本字段中重现)
这两行中的“分组依据”返回2个单独的行

这会导致一些问题,包括我无法导出和重新导入数据库。重新导入错误时会提到插入失败,因为它违反了约束。

理论上我可以尝试导入,等待第一个错误,修复导入脚本和原始数据库,然后重复。在实践中,这将需要永远。

有没有办法列出所有异常或强制数据库重新检查约束(并列出与它们相反的所有值/行)?

如果它有用,我可以提供.MYD文件。

4 个答案:

答案 0 :(得分:2)

列出所有异常:

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

有几种方法可以解决删除重复问题的方法,您的路径将在很大程度上取决于您拥有的重复数量。

请参阅this 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;

答案 1 :(得分:0)

创建一个新表,按唯一键选择所有行和组(在示例列名中)并插入新表中。

答案 2 :(得分:0)

要找出该字符的内容,请执行以下查询:

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

您将获得该'square'的ascii代码。

如果该字符为'x',则可以像这样更新:(但如果该列为唯一,则会出现一些错误)

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

答案 3 :(得分:0)

我认为这是一个MySQL 4.1随机错误。有些值只是因为没有特殊原因而自行改变,即使它们违反了一些MySQL约束。 MySQL只是忽略了这些违规行为。

为了解决我的问题,我将编写一个prog,试图在同一个表中对每一行数据进行resinsert(准确地说:另一个具有相同特性的表)并记录每个失败的实例。

如果有人遇到同样的问题并且其他人找到了更实际的解决方案,我会暂时搁置事件。