2010-02-16 74 views
1

我正在使用MySQL 4.1。一些表具有違反約束條件的重複條目。修復數據庫重複項(MySQL bug)

當我嘗試對行進行分組時,MySQL不會將行識別爲相似。

實施例:

表A具有列 「姓名」 與唯一proprety。
表中包含一行,名稱爲「Hach?」。和一行同名,但最後一個正方形而不是'?' 「按組」(這是我不能在這個文本字段複製)
一上這2行返回2個獨立的行

這會導致幾個問題,包括的事實,我無法導出並重新導入數據庫。重新導入一個錯誤時會提到一個Insert由於違反約束而失敗。

理論上我可以嘗試導入,等待第一個錯誤,修復導入腳本和原始數據庫,然後重複。實踐中,這將需要永遠。

是否有辦法列出所有異常或強制數據庫重新檢查約束(並列出所有違反它們的值/行)?

如果能提供幫助,我可以提供.MYD文件。

+0

如果這兩個名稱不相等,只要不違反重複的約束。我不會在這裏跟隨你。如果數據是損壞的,你應該糾正它。 – crunchdog 2010-02-16 15:36:52

+0

當我導出並重新導入數據時,它們是平等的。 「如果數據是腐敗的,你應該糾正它。」我如何找到損壞的數據?我無法搜索廣場​​。 – 2010-02-16 15:48:27

+0

對不起,如果我的描述是不準確的,但問題是很奇怪的。 – 2010-02-16 15:56:08

回答

0

我會認爲這是一個MySQL 4.1的bug隨機。即使某些值違反了一些MySQL約束條件,它們的值也會因爲沒有特殊原因而自行更改。 MySQL只是無視這些違規行爲。

爲了解決我的問題,我將編寫一個程序,試圖在同一個表中樹立每行數據(具體來說:具有相同特徵的另一個表)並記錄每個故障實例。

我將離開事件開一會兒,以防有人得到了同樣的問題和別人找到一個更實際的解決方案。

2

要列出所有異常:

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

有解決刪除複本和你的路徑將在很大程度上取決於你的DUP數量的幾種方法。

請參閱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; 
+0

第一個查詢不返回任何內容。 2表有這個問題。無論是他們還是他們都行不通。在一個副本中,我可以識別出一個不同的caracter。然而,當它試圖插入時,MYSQL發現它是相同的字符。我會更新我的描述。 – 2010-02-16 15:19:24

+0

您是否檢查過以確保您的列值中沒有空格?我猜你有一個像'鮑勃'和'鮑勃'之類的價值。 – 2010-02-16 15:39:40

+0

這不是空格。 – 2010-02-16 17:21:39

0

創建一個新表,通過選擇獨特的鍵(例如列名)的所有行和組,並在新表中插入。

+0

嗯,你怎麼一個得到解組值... – crunchdog 2010-02-16 14:32:55

+0

「集團通過」不工作。我編輯了我的問題。 – 2010-02-16 15:26:34

0

要搞清楚什麼是該字符,執行以下查詢:

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

你會本身的那個「正方形」的ASCII碼。

如果字符是'x',你可以更新這樣的:(但如果該列是唯一,你將有一些錯誤)

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

是的,謝謝。不幸我有這樣的數百例,只有其中一個以「哈希」開頭。我如何找到他們? – 2010-02-25 14:22:28

+0

但是最後一個字符('正方形')是否一樣? – 2010-02-25 16:52:16

+0

方並不總是最後一個字符可以有大於1,他們似乎在說話要更換口音:語言是法語,很多字有口音。另一方面,一些口音不能被「正方形」取代。 – 2010-03-29 18:30:00