it-swarm.com.de

Fehler beim doppelten Eintrag von MySQL, obwohl kein doppelter Eintrag vorliegt

Ich verwende MySQL 5.1.56, MyISAM. Mein Tisch sieht so aus:

CREATE TABLE IF NOT EXISTS `my_table` (
  `number` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `money` int(11) NOT NULL,
  PRIMARY KEY (`number`,`name`)
) ENGINE=MyISAM;

Es enthält diese beiden Zeilen:

INSERT INTO `my_table` (`number`, `name`, `money`) VALUES
(1, 'S. Name', 150), (2, 'Another Name', 284);

Jetzt versuche ich eine weitere Zeile einzufügen:

INSERT INTO `my_table` (`number`, `name`, `money`) VALUES
(2, 'S. Name', 240);

Und MySQL fügt es einfach nicht ein, während ich Folgendes sage:

#1062 - Duplicate entry '2-S. Name' for key 'PRIMARY'

Ich verstehe das wirklich nicht. Der Primärschlüssel befindet sich in den ersten beiden Spalten (beide), also in der Zeile, in der ich versuche, einen eindeutigen Primärschlüssel einzufügen, nicht?

Ich habe versucht, den Tisch zu reparieren, ich habe versucht, den Tisch zu optimieren, alles ohne Erfolg. Bitte beachten Sie auch, dass ich nicht von MyISAM zu InnoDB wechseln kann.

Fehlt mir etwas oder ist dies ein Fehler von MySQL oder MyISAM? Vielen Dank.

Um zusammenzufassen und aufzuzeigen, wo ich denke, liegt das Problem (obwohl es nicht sein sollte): Tabelle hat Primärschlüssel in zwei Spalten. Ich versuche, eine Zeile mit einer neuen Kombination von Werten in diesen beiden Spalten einzufügen, aber der Wert in Spalte 1 ist bereits in einer Zeile und der Wert in Spalte 2 ist bereits in einer anderen Zeile. Aber sie sind nicht überall miteinander verbunden, daher glaube ich, dass dies funktionieren sollte, und ich bin sehr verwirrt zu sehen, dass dies nicht der Fall ist.

18
user1763581

Ihr Code und Schema sind in Ordnung. Sie versuchen wahrscheinlich die vorherige Version der Tabelle.

http://sqlfiddle.com/#!2/9dc64/1/0

Ihre Tabelle hat sogar keine UNIQUE, so dass Fehler in dieser Tabelle nicht möglich sind.

Sichern Sie Daten aus dieser Tabelle, legen Sie sie ab und erstellen Sie sie neu.

Möglicherweise haben Sie versucht, diesen CREATE TABLE IF NOT EXIST auszuführen. Es wurde nicht erstellt, Sie haben eine alte Version, aber wegen IF NOT EXIST trat kein Fehler auf. 

Sie können SQL wie folgt ausführen, um die aktuelle Tabellenstruktur anzuzeigen:

DESCRIBE my_table;

Bearbeiten - später hinzugefügt:

Versuchen Sie das auszuführen:

DROP TABLE `my_table`; --make backup - it deletes table

CREATE TABLE `my_table` (
  `number` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `money` int(11) NOT NULL,
  PRIMARY KEY (`number`,`name`),
  UNIQUE (`number`, `name`) --added unique on 2 rows
) ENGINE=MyISAM;
13
Kamil

Ich weiß, dass dies in diesem Fall nicht das Problem war, aber ich hatte beim Erstellen eines zusammengesetzten Primärschlüssels ein ähnliches Problem mit "Duplicate Entry":

ALTER TABLE table ADD PRIMARY KEY(fieldA,fieldB); 

Der Fehler war so etwas wie:

#1062 Duplicate entry 'valueA-valueB' for key 'PRIMARY'

Also habe ich gesucht:

select * from table where fieldA='valueA' and fieldB='valueB'

Und die Ausgabe zeigte nur eine Zeile, kein Duplikat!

Nach einiger Zeit habe ich herausgefunden, dass Sie diese Fehler erhalten, wenn Sie NULL-Werte in diesem Feld haben. Am Ende war die Fehlermeldung irgendwie irreführend.

8
carla

In meinem Fall wurde der Fehler durch das veraltete Schema verursacht. Eine Spalte war ursprünglich varchar(50), aber der Speicherauszug, den ich importieren wollte, wurde aus einer geänderten Version des Schemas erstellt, das varchar(70) für diese Spalte (und einige Einträge dieses Felds) enthält mit mehr als 50 Zeichen).

Während des Imports wurden einige Schlüssel abgeschnitten und die abgeschnittene Version war nicht mehr eindeutig. Es dauerte eine Weile, bis ich herausfand, dass ich dachte "dieser angeblich duplizierte Schlüssel existiert nicht einmal!".

1
flagg19

Ihr Code funktioniert gut mit dieser Demo:

http://sqlfiddle.com/#!8/87e10/1/0

Ich denke, Sie machen die zweite Abfrage (Einfügen ...) zweimal. Versuchen 

select * from my_table

bevor Sie eine neue Zeile einfügen, erhalten Sie, dass Ihre Daten bereits vorhanden sind oder nicht.

1
Habibillah

Weniger häufige Fälle, aber denken Sie daran, dass gemäß DOC https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-limitations .html

Beim Ausführen einer Online-Operation ALTER TABLE wendet der Thread, der die Operation ALTER TABLE ausführt, ein „Online-Protokoll“ von DML-Operationen an, die gleichzeitig in derselben Tabelle von anderen Verbindungsthreads ausgeführt wurden. Wenn die DML-Operationen angewendet werden, ist es möglich, dass ein doppelter Schlüsseleingabefehler auftritt (FEHLER 1062 (23000): doppelter Eintrag), auch wenn der doppelte Eintrag nur vorübergehend ist und durch einen späteren Eintrag im „Online-Protokoll“ zurückgesetzt würde. . Dies ähnelt der Idee einer Fremdschlüssel-Integritätsprüfung in InnoDB, in der Integritätsbedingungen während einer Transaktion gelten müssen.

1
Xeoncross

Falls dies allen außer dem OP hilft, hatte ich ein ähnliches Problem bei der Verwendung von InnoDB .

Für mich war wirklich ein Misserfolg der Fremdschlüsselbeschränkung los. Ich bezog mich auf einen Fremdschlüssel, der nicht existierte.

Mit anderen Worten, der Fehler war komplett aus. Der Primärschlüssel war in Ordnung und das Problem wurde durch das Einfügen des Fremdschlüssels behoben. Keine Ahnung, warum MySQL das plötzlich falsch gemacht hat.

0
Timo

Dieses Problem tritt häufig auf, wenn Sie eine Spalte hinzufügen oder eine vorhandene Spalte als Primärschlüssel verwenden. Es wird nicht aufgrund eines vorhandenen Primärschlüssels erstellt, der nie erstellt wurde, oder aufgrund einer Beschädigung der Tabelle.

Was der Fehler tatsächlich bedeutet, ist, dass ein ausstehender Schlüsselwert leer ist. 

Die Lösung besteht darin, die Spalte mit eindeutigen Werten zu füllen und dann den Primärschlüssel erneut zu erstellen. Es dürfen keine leeren, Null- oder doppelten Werte vorhanden sein oder dieser irreführende Fehler wird angezeigt.  

0
Robert Mauro

Versuchen Sie es mit Auto Inkrement:

CREATE TABLE IF NOT EXISTS `my_table` (
   `number` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(50) NOT NULL,
   `money` int(11) NOT NULL,
    PRIMARY KEY (`number`,`name`)
) ENGINE=MyISAM;
0
grai

Falls jemand anderes diesen Thread mit meinem Problem findet - ich habe in MySQL einen ganzzahligen Spaltentyp verwendet. Die Zeile, die ich einzufügen versuchte, hatte einen Primärschlüssel mit einem größeren Wert als durch Integer zulässig. Durch das Umschalten auf "bigint" wurde das Problem behoben.

0
Ben Wilson

In meinem Fall war der Fehler sehr irreführend. Das Problem war, dass PHPMyAdmin "ALTER TABLE" verwendet, wenn Sie auf die Schaltfläche "Unikat machen" anstelle von "ALTER IGNORE TABLE" klicken. Daher musste ich es manuell tun, wie in:

ALTER TABLE mytbl ADD UNIQUE (columnName);
0

ich habe es gerade ausprobiert, und wenn Daten und Tabellenwiederherstellung nicht funktionieren würden, ändern Sie einfach die Tabelle in InnoDB und versuchen Sie es erneut. Dies würde das Problem beheben

0
Janos Szabo

Ich hatte ein ähnliches Problem, aber in meinem Fall stellte sich heraus, dass ich die Sortierung ohne Berücksichtigung der Groß-/Kleinschreibung verwendete - utf8_general_ci.

Als ich also versuchte, zwei Zeichenfolgen einzufügen, bei denen zwischen Groß- und Kleinschreibung unterschieden wurde, bei denen jedoch die Groß- und Kleinschreibung nicht berücksichtigt wurde, löste MySQL den Fehler aus, und ich konnte das Problem nicht verstehen, da ich zwischen Groß- und Kleinschreibung unterschied Suche.

Die Lösung besteht darin, die Sortierung einer Tabelle zu ändern, z. Ich benutzte utf8_bin, bei dem die Groß-/Kleinschreibung beachtet wird (oder utf8_general_cs sollte auch angebracht sein).

0
RussCoder

Gemäß Ihrem Code sind Ihre "Nummer" und "Name" Primärschlüssel und Sie fügen S.NAME in beide Zeilen ein, sodass ein Konflikt entsteht. Wir verwenden Primärschlüssel für den Zugriff auf vollständige Daten. Hier können Sie nicht über den Primärschlüssel 'Name' auf die Daten zugreifen. 

ich bin ein Anfänger und ich denke, es könnte der Fehler sein. 

0
Megamind