it-swarm.com.de

1062 Doppelter Eintrag, aber keine Duplikate?

Ich bekomme immer wieder diesen Fehler:

fehler beim EINFÜGEN: [1062] Doppelter Eintrag 'Upping Your Type Game - http://jessicahische.is/talkingtype ' für Schlüssel 'PRIMARY'.

Das Problem ist, dass es keine doppelten Einträge gibt. Deshalb bin ich verwirrt, wenn ich diesen Fehler erhalte.

Gibt es eine Möglichkeit, mit InnoDB zu überprüfen?

Ich habe versucht, die Tabelle zu exportieren und den SQL-Code zu lesen, und nach Duplikaten gesucht, aber es gab keine.

8
Chris Burton

Es heißt nicht, dass es einen doppelten Eintrag in der Tabelle gibt bereits, es heißt, dass dort bereits eins Eintrag mit diesem Wert für die Primärschlüssel und es weigert sich aus diesem Grund, eine Sekunde 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 werden eine übereinstimmende Zeile finden und Ihr Code versucht zum Zeitpunkt des Fehlers, eine zweite einzufügen.

Umgang mit Duplikaten beim Einfügen:

Wenn Sie versuchen, INSERT doppelte Werte für einen Primärschlüssel (oder einen eindeutigen Index) zu verwenden, 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 das MySQL-spezifische ON DUPLICATE KEY UPDATE Option (siehe https://stackoverflow.com/questions/1218905/how-do-i-update-if-exists-insert-if-not-aka-upsert-or-merge-in-mysql) ) wenn Sie gerne die Kompatibilität mit anderen RDBMS opfern.

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, wie im SQL: 2003-Standard definiert (siehe https://en.wikipedia.org/wiki/Merge_ (SQL) ), die die gleiche Funktionalität und mehr erreichen soll. Seien Sie mit einer dieser Optionen vorsichtig, wenn die datenbankübergreifende Kompatibilität eines Ihrer Ziele ist (oder wahrscheinlich in Zukunft sein wird).

5
David Spillett

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.

mysql> select * from users_sessions;
+---------+----------------------------+---------------------+
| user_id | session_id                 | last_accessed       |
+---------+----------------------------+---------------------+
|       3 | 6n02k8catt2kdn30b92ljtrpc6 | 2019-01-13 23:30:53 |
+---------+----------------------------+---------------------+
1 row in set (0.00 sec)

mysql>
mysql> INSERT INTO `users_sessions` VALUES(3,"fbfibdog1qumlj5mg4kstbagu7","2019-01-14 18:37:15") ON DUPLICATE KEY UPDATE last_accessed = "2019-01-14 18:37:15";
ERROR 1062 (23000): Duplicate entry '3-fbfibdog1qumlj5mg4kstbagu7' for key 'PRIMARY'

Es gibt keinen solchen doppelten Schlüssel!

Ich habe versucht, dieselbe Einfügung ohne die Klausel ON DUPLICATE KEY ... Auszuführen, und habe einen besseren Hinweis darauf erhalten, was passiert ist.

mysql> INSERT INTO `users_sessions` VALUES(3,"fbfibdog1qumlj5mg4kstbagu7","2019-01-14 18:37:15");
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`login`.`users_sessions`, CONSTRAINT `fk_sessions_id` FOREIGN KEY (`session_id`) REFERENCES `sessions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

Jetzt sind wir auf etwas. Also habe ich versucht, die ursprüngliche Abfrage mit einem anderen Wert auszuführen, der einen übereinstimmenden Wert in der Fremdschlüsseltabelle hat. 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 Implementiert ist. Ich habe versucht, dieselbe Einfüge-Abfrage wie eine REPLACE INTO - Abfrage auszuführen, und habe denselben Fehler erhalten.

mysql> REPLACE INTO `users_sessions` VALUES(3,"fbfibdog1qumlj5mg4kstbagu7","2019-01-14 18:37:15");
ERROR 1062 (23000): Duplicate entry '3-fbfibdog1qumlj5mg4kstbagu7' for key 'PRIMARY'

Wenn dieser Fehler ohne ersichtlichen Grund auftritt, überprüfen Sie Ihre Fremdschlüssel. Versuchen Sie auch eine reguläre INSERT-Abfrage (anstelle von REPLACE INTO Oder INSERT ... ON DUPLICATE KEY UPDATE...).

0
Buttle Butkus

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.

0
know_some