2012-09-10 19 views
15

Warum erzeugt diese Abfrage einen Fehler "Doppeleintrag"?SELECT DISTINCT funktioniert nicht

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

Fehlermeldung:

SQL-Fehler (1062): doppelte Eintrag ‚1 - ??????? ?????? für Schlüssel ‚firm_tag_name_value‘

Wie Sie sehen können, firm_tag_name_value einen eindeutigen Index hat, verwende ich DISTINCT wählen, und ich bin alle vorhandenen Daten aus tag_names Kürzen.

Was könnte diesen Fehler verursachen? mit deutlichen können die Ergebnisse in unterschiedlichen Werten auf Groß- und Kleinschreibung und Groß- und Kleinschreibung collation Werte

+0

Was sind die Definitionen für beide Tabellen? Vielleicht ein Effekt von impliziten Konvertierungen zwischen verschiedenen Datentypen oder verschiedenen Optionen für die Groß- und Kleinschreibung? –

+2

Ich vermute, es hat mit Zeichensätzen (Kollatierungen) in 'parim_marksona.sona' vs' parim_firm_tag_names.firm_tag_name_value' zu ​​tun. Die Fragezeichen in der Fehlermeldung weisen darauf hin, dass in den Daten einige nicht englische Zeichen enthalten sind. –

+0

Bitte geben Sie die Tabellenstruktur an, um den genauen Grund für diesen Fehler zu sehen. –

Antwort

16

Dies könnte wegen der unterschiedlichen collations auf beiden Tabellen parim_firm_tag_names und parim_marksona als String-Vergleiche definiert werden passiert.

Sie können collation von Spalten überprüfen Sie diese Abfrage mit:

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

diesen Fehler zu vermeiden, können Sie Zusammenstellung der Spalte sona auf die Zusammenstellung der Spalte firm_tag_name_value mit COLLATE umwandeln kann, während die unterschiedlichen Werte aus Tabelle auswählen parim_marksona .

Unter der Annahme, Zusammenstellung der Spalte firm_tag_name_value als 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; 

Diese fehlerfrei funktionieren soll.

Weitere Informationen finden Sie im Handbuch Column Character Set and Collation.

+1

Ja, habe das gerade herausgefunden :) Du bist Gewinner :) – Kristian

1

Verschiedene Zeichensätze zwischen den beiden Tabellen, vielleicht?