我正在使用MySQL 4.1。某些表具有违反约束条件的重复条目。
当我尝试对行进行分组时,MySQL不会将这些行识别为相似。
示例:
表A有一个具有唯一属性的“名称”列
该表包含一行名为'Hach?'的行并且一行具有相同的名称,但最后是一个正方形而不是'?' (我无法在此文本字段中重现)
这两行中的“分组依据”返回2个单独的行
这会导致一些问题,包括我无法导出和重新导入数据库。重新导入错误时会提到插入失败,因为它违反了约束。
理论上我可以尝试导入,等待第一个错误,修复导入脚本和原始数据库,然后重复。在实践中,这将需要永远。
有没有办法列出所有异常或强制数据库重新检查约束(并列出与它们相反的所有值/行)?
如果它有用,我可以提供.MYD文件。
答案 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(准确地说:另一个具有相同特性的表)并记录每个失败的实例。
如果有人遇到同样的问题并且其他人找到了更实际的解决方案,我会暂时搁置事件。