Es heißt nicht, dass die Tabelle bereits einen doppelten Eintrag enthält , sondern dass bereits ein Eintrag mit diesem Wert für den Primärschlüssel vorhanden ist, und es wird aus diesem Grund abgelehnt, einen zweiten einzufügen.
Ich vermute, wenn Sie laufen:
SELECT *
FROM <table>
WHERE <keyfield> = 'Upping Your Type Game-http://jessicahische.is/talkingtype'
oder wenn dieser Schlüssel ein Verbund ist
SELECT *
FROM <table>
WHERE <keyfield1> = 'Upping Your Type Game'
AND <keyfield2> = 'http://jessicahische.is/talkingtype'
Sie finden eine übereinstimmende Zeile, und Ihr Code versucht zum Zeitpunkt des Fehlers, eine zweite einzufügen.
Umgang mit Duplikaten auf Beilage:
Wenn Sie INSERT
doppelte Werte für einen Primärschlüssel (oder einen eindeutigen Index) versuchen , wird dieser Fehler immer angezeigt. Es gibt verschiedene Möglichkeiten: Überprüfen Sie dies vor dem Einfügen und führen Sie entweder ein Update durch (wenn sich etwas geändert hat) oder tun Sie einfach nichts.
Es gibt auch die MySQL-spezifische ON DUPLICATE KEY UPDATE
Option (siehe /programming/1218905/how-do-i-update-if-exists-insert-if-not-aka-upsert-or-merge-in-mysql) ), wenn Sie gerne auf die Kompatibilität mit anderen RDBMS verzichten.
Ab Version 9.5 unterstützt Postgres eine ähnliche Funktion mit leicht unterschiedlicher Syntax ( ON CONFLICT DO UPDATE/NOTHING
siehe https://wiki.postgresql.org/wiki/UPSERT ).
MS SQL Server, Oracle und einige andere Systeme unterstützen MERGE
Anweisungen gemäß dem SQL: 2003-Standard (siehe https://en.wikipedia.org/wiki/Merge_(SQL) ), mit denen dieselbe Funktionalität und mehr erreicht werden sollen. Seien Sie mit einer dieser Optionen vorsichtig, wenn die datenbankübergreifende Kompatibilität eines Ihrer Ziele ist (oder wahrscheinlich in Zukunft sein wird).
INSERT ... ON DUPLICATE KEY UPDATE
/REPLACE INTO
ist, ein Fremdschlüssel ist, der nicht in der übergeordneten Tabelle (Spalte) vorhanden ist. Siehe meine Antwort unten.Möglicherweise haben Sie das Limit Ihrer ID-Spalte (den PRIMARY KEY) erreicht. Wenn Ihre Spalte beispielsweise als tinyint (4) definiert ist, können Sie nach Erreichen des Werts von 127 nicht höher werden. Wenn Sie versuchen, in diese Spalte einzufügen, ist der höhere Wert immer noch 127, aber Sie haben bereits einen Eintrag mit diesem Wert. Der Fehler zeigt Ihnen also an, dass Sie versuchen, einen doppelten Eintrag ('127') einzugeben.
Lösung: Ändern Sie die Definition Ihres PRIMARY KEY in eine höhere INT.
quelle
Ich habe gerade den gleichen Fehler erhalten. Meine Tabelle hat nur 1 Zeile und es gibt kein Duplikat.
TLDR: Überprüfen Sie Ihre Fremdschlüssel und stellen Sie sicher, dass der Wert in der übergeordneten Tabelle vorhanden ist. MySQL 5.6.3 kann Ihnen anscheinend den wahren Grund für den Fehler nicht sagen.
Es gibt keinen solchen doppelten Schlüssel!
Ich habe versucht, dieselbe Einfügung ohne die
ON DUPLICATE KEY ...
Klausel auszuführen, und habe einen besseren Hinweis darauf erhalten, was passiert ist.Jetzt sind wir auf etwas. Daher habe ich versucht, die ursprüngliche Abfrage mit einem anderen Wert auszuführen , der einen übereinstimmenden Wert in der Fremdschlüsseltabelle aufweist. Die Abfrage lief ohne Probleme.
Warum scheint MySQL den falschen Fehler auszugeben? Ich bin mir nicht sicher, aber es hat wahrscheinlich damit zu tun, wie
ON DUPLICATE KEY UPDATE
es umgesetzt wird. Ich habe versucht, dieselbe Einfüge-Abfrage wie eineREPLACE INTO
Abfrage auszuführen, und habe denselben Fehler erhalten.Wenn dieser Fehler ohne ersichtlichen Grund auftritt, überprüfen Sie Ihre Fremdschlüssel. Versuchen Sie auch eine reguläre
INSERT
Abfrage (anstelle vonREPLACE INTO
oderINSERT ... ON DUPLICATE KEY UPDATE...
).quelle
Ich habe einen solchen Fehler, wenn ich ein System heruntergefahren oder ein Netzwerkproblem habe. Sie haben wirklich kein Duplikat in Ihrer Datenbank. Das ist ein MySQL-Datenbankfehler. Alles, was Sie tun müssen, ist, dass Sie, wenn Sie Ihre Einfügung vornehmen und dies nicht der Fall ist, einfach eine der Spalten Ihrer Tabelle ändern, in die Sie entweder von
varchar
bistext
oder einfügen möchten,bigint
und dann die Einfügung wiederholen . Das wird das Problem lösen.quelle