2010-11-29 9 views
2

Dies ist die problematische Abfrage (mit der beabsichtigten Bedeutung: ziehen Sie alle Entitäten gepaart mit Entity 530 in eine neue Tabelle, mit der Zählung der Paare):MySQL seltsamer Fehler in CREATE ... SELECT: Fehler 1062 (23000): Doppelter Eintrag '0' für Schlüssel 1

CREATE TEMPORARY TABLE paired (
    entity_id INTEGER PRIMARY KEY, 
    numrels INTEGER 
) 
SELECT I.entity2_id, COUNT(I.relation_id) AS numrels 
FROM pairs I 
WHERE I.entity1_id = 530 AND I.entity2_id IS NOT NULL 
GROUP BY I.entity2_id 
; 

interpretiere ich die Fehlermeldung:

ERROR 1062 (23000): Duplicate entry '0' for key 1 

als Beschwerde, die ich Primärschlüssel der Einzigartigkeit bin zu verletzen. Allerdings bin ich Gruppierung von diesem Wert, der die Einzigartigkeit sicherstellen sollte, oder? Dann dachte ich, dies zu versuchen:

CREATE TEMPORARY TABLE paired (
    entity_id INTEGER PRIMARY KEY, 
    numrels INTEGER 
) 
; 
INSERT INTO paired 
SELECT I.entity2_id, COUNT(I.relation_id) AS numrels 
FROM pairs I 
WHERE I.entity1_id = 530 AND I.entity2_id IS NOT NULL 
GROUP BY I.entity2_id 
; 

Erstaunlicherweise dies ohne Probleme funktioniert, obwohl, nach meinem Verständnis soll die zwei gleichwertig sein.

Was gibt?!?

Zum Vergleich:

mysql Ver 14.12 Distrib 5.0.82sp1, for redhat-linux-gnu (x86_64) using readline 5.1 
+0

Sind die ID-Werte, die Sie erhalten, einzigartig? Können Sie einige Beispieldaten posten? –

Antwort

4

Ihre Aussagen sind nicht gleichwertig. CREATE ... SELECT erstellt die Spalten, die Sie im CREATE-Teil der Anweisung (dh, entity_id und numrels) angeben, und erstellt außerdem Spalten für jede Spalte des SELECT-Teils der Anweisung. Sie erhalten vier Spalten in Ihrer neuen Tabelle. Die Ergebnisse von SELECT werden in die letzten beiden Spalten eingefügt. Die anderen Spalten sind mit ihren Standardwerten gefüllt, wodurch die Eindeutigkeit Ihres Primärschlüssels verletzt wird.

Siehe auch http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html

+1

Danke! Nicht ganz korrekt, aber richtig genug, dass ich verstanden habe, was passiert ist. Genauer gesagt: Ich habe eine ähnliche Abfrage, und diese funktioniert. Der Grund dafür ist, dass die Abfrage zuvor 'entity_id' in' SELECT' und 'CREATE' hatte; In diesem habe ich 'entity2_id'. Wenn die Spaltennamen identisch sind, werden sie zusammengeführt. Also hatte ich zwei Spalten in dieser, aber drei in dieser ('entity_id',' numrels', 'entity2_id'). : D – Amadan

Verwandte Themen