2012-09-10 156 views
15

爲什麼此查詢產生「重複項」錯誤?SELECT DISTINCT不起作用

TRUNCATE parim_firm_tag_names; 
INSERT INTO parim_firm_tag_names (firm_tag_name_value) 
    SELECT DISTINCT sona 
    FROM parim_marksona; 

錯誤消息:

SQL錯誤(1062):複製條目「1 - ??????? ??????」關鍵 「firm_tag_name_value」

正如你所看到的,firm_tag_name_value有一個唯一索引,我用DISTINCT選擇,我從tag_names截斷所有的現有數據。

什麼會產生這個錯誤?

+0

這兩個表的定義是什麼?也許是不同數據類型或不同區分大小寫選項之間的隱式轉換的影響? –

+2

我猜它必須處理'parim_marksona.sona'中的字符集(排序規則)與'parim_firm_tag_names.firm_tag_name_value'。錯誤消息中的問號表明數據中有一些非英文字符。 –

+0

請提供表結構以查看此錯誤的確切原因。 –

回答

16

這可能是因爲在這兩個表parim_firm_tag_namesparim_marksona如使用上區分大小寫和不區分大小寫collation值不同的值不同的5結果的字符串比較定義的不同collations的發生。

您可以使用此查詢檢查列collation

SHOW FULL COLUMNS FROM parim_marksona; 
SHOW FULL COLUMNS FROM parim_firm_tag_names; 

爲了避免這種錯誤,可以sona列的排序規則轉換爲使用COLLATEfirm_tag_name_value的整理,而從表parim_marksona選擇不同的值。

假設firm_tag_name_value列的排序規則latin1_swedish_cs

TRUNCATE parim_firm_tag_names; 

INSERT INTO parim_firm_tag_names (firm_tag_name_value) 
    SELECT DISTINCT sona COLLATE latin1_swedish_cs 
    FROM parim_marksona; 

這應該沒有錯誤工作。

欲瞭解更多詳情,請參閱手冊Column Character Set and Collation

+1

是的,只是想通了:)你是贏家:) – Kristian

1

這兩個表格之間可能有不同的字符集?