MySQL seltsame Fehler in CREATE ... SELECT: ERROR 1062 (23000): Doppelte Eintrag '0' für die Taste 1
-
29-09-2019 - |
Frage
Dies ist die problematische Abfrage (mit der Bedeutung bestimmt: alle Entitäten mit Einheit 530 in eine neue Tabelle gepaart ziehen, mit der Zählung der Paare):
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
;
ich die Fehlermeldung interpretieren:
ERROR 1062 (23000): Duplicate entry '0' for key 1
als Beschwerde, dass ich Primärschlüssel der Einzigartigkeit bin zu verletzen. Ich bin aber Gruppierung von diesem Wert, der die Einzigartigkeit gewährleisten sollte, nicht wahr? 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 funktioniert dies ohne Probleme, obwohl, nach meinem Verständnis soll die zwei gleichwertig sein.
Was soll das?!?
Referenz:
mysql Ver 14.12 Distrib 5.0.82sp1, for redhat-linux-gnu (x86_64) using readline 5.1
Lösung
Ihre Aussagen sind nicht gleichwertig. CREATE ... SELECT
erstellt die Spalten, die Sie in der CREATE
Teil der Aussage erwähnen (das heißt, ENTITY_ID und numrels) und zusätzlich schafft Spalten für jede Spalte des SELECT
Teil der Aussage. Sie enden mit vier Spalten in Ihrem neuen Tisch. Die Ergebnisse der SELECT
werden in die letzten zwei Spalten eingefügt. Die anderen Spalten sind mit ihren Standardwerten gefüllt, die Ergebnisse in die Einzigartigkeit Ihrer Primärschlüssel verletzen.
Siehe auch http: //dev.mysql. com / doc / refman / 5.0 / de / create-table-select.html