1062 Doppelter Eintrag, aber keine Duplikate?

8

Ich bekomme immer wieder diesen Fehler:

Fehler beim EINFÜGEN: [1062] Doppelter Eintrag 'Upping Your Type Game- http://jessicahische.is/talkingtype ' für den 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, dies 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.

Chris Burton
quelle

Antworten:

5

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 INSERTdoppelte 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 UPDATEOption (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/NOTHINGsiehe https://wiki.postgresql.org/wiki/UPSERT ).

MS SQL Server, Oracle und einige andere Systeme unterstützen MERGEAnweisungen 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).

David Spillett
quelle
Anstatt alle Artikel aus meinem Feed zu holen, frage ich mich, ob ich nur den letzten Artikel im Feed abrufen und ihn EINFÜGEN lassen oder zuerst die Datenbank überprüfen und nur EINFÜGEN soll, was nicht vorhanden ist. Gedanken?
Chris Burton
2
Wenn Sie versuchen, doppelte Werte für einen Primärschlüssel (oder einen eindeutigen Index) einzufügen, 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 Option "ON DUPLICATE KEY UPDATE" (siehe stackoverflow.com/questions/1218905/… ), wenn Sie gerne auf die Kompatibilität mit anderen RDBMS verzichten.
David Spillett
@DavidSpillett Sie erhalten den gleichen Fehler, wenn einer der Werte, die Sie versuchen INSERT ... ON DUPLICATE KEY UPDATE/ REPLACE INTOist, ein Fremdschlüssel ist, der nicht in der übergeordneten Tabelle (Spalte) vorhanden ist. Siehe meine Antwort unten.
Buttle Butkus
0

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.

know_some
quelle
0

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 ON DUPLICATE KEY ...Klausel 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. 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 UPDATEes umgesetzt wird. Ich habe versucht, dieselbe Einfüge-Abfrage wie eine REPLACE INTOAbfrage 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 INSERTAbfrage (anstelle von REPLACE INTOoder INSERT ... ON DUPLICATE KEY UPDATE...).

Buttle Butkus
quelle
-2

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 varcharbis textoder einfügen möchten, bigintund dann die Einfügung wiederholen . Das wird das Problem lösen.

If(!$insert){
$alter=Mysql_query("alter table `table_name` 
                    change `table_name` `table_name` bigint(255) not null");
If($alter){
//you then redo your insertion.
}
}
Casey
quelle