2016-04-15 11 views
-1

Titel sagt alles.Fehler 1062, "doppelten Eintrag '[email protected]' für Schlüssel 'Email_UNIQUE'" auf leere Tabelle

Leere Tabelle mit folgender Erstellungssyntax, nur Tabelle in Datenbank.

CREATE TABLE IF NOT EXISTS `ACME`.`Registration` (
    `ConfirmationNumber` INT NOT NULL AUTO_INCREMENT, 
    `FirstName` VARCHAR(45) NOT NULL, 
    `LastName` VARCHAR(45) NOT NULL, 
    `CompanyName` VARCHAR(100) NOT NULL, 
    `Title` VARCHAR(60) NOT NULL, 
    `Email` VARCHAR(60) NOT NULL, 
    `PhoneNumber` VARCHAR(20) NOT NULL, 
    `StreetAddress` VARCHAR(100) NOT NULL, 
    `City` VARCHAR(30) NOT NULL, 
    `Province` VARCHAR(30) NOT NULL, 
    `ZipCode` VARCHAR(10) NOT NULL, 
    `Country` VARCHAR(40) NOT NULL, 
    PRIMARY KEY (`ConfirmationNumber`), 
    UNIQUE INDEX `ConfirmationNumber_UNIQUE` (`ConfirmationNumber` ASC), 
    UNIQUE INDEX `Email_UNIQUE` (`Email` ASC), 
    UNIQUE INDEX `PhoneNumber_UNIQUE` (`PhoneNumber` ASC)) 
ENGINE = InnoDB 

Alle Inserts erhalten diesen Fehler.

Ich habe versucht, mit und ohne 0 für die automatische Inkrementierung Bestätigungsnummer einfügen.

Ich denke, diese könnte etwas mit meiner Installation von MySQL zu tun haben, wie der (Mac) Systemeinstellungen zeigt, dass der Server läuft, aber wenn ich versuche, vom Terminal zu stoppen/starten, bekomme ich seltsame Fehler . Im Einzelnen:

$ mysql.server stop 
ERROR! MySQL server PID file could not be found! 
$ mysql.server start 
Starting MySQL 
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/rover-231-4.rovernet.mtu.edu.pid). 

Obwohl Ich weiß, dass ich auf den richtigen Server anschließe (localhost) und Datenbank, da die Daten EINZUFÜGEN in der Registrierungstabelle bekommt.

Dies ist ein Python/MySQL/Flask -> HTML/CSS/JS-Stack, von denen ich alle neu bin. Python-Code einzufügen ist:

query_string = (
     "INSERT INTO Registration " 
     "(FirstName, LastName, CompanyName, Title, Email, PhoneNumber, " 
     "StreetAddress, City, Province, ZipCode, Country) " 
     "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);") 
    cursor.execute(query_string, (first_name, last_name, company, title, email, phone, address, city, state, zipcode, country)) 

EDIT: Ich sollte noch hinzufügen, dass, bis ich in ein Installationsproblem lief und musste neu installieren, die genau die gleiche Code funktioniert völlig in Ordnung.

Antwort

0

Angesichts der Teile des Codes, die gezeigt werden, werden wir vermuten, dass die E-Mail-Variable die Zeichenfolge "[email protected]" zum Zeitpunkt der Abfrage ausgeführt enthält.

Ich schlage vor, Sie versuchen, eine Abfrage der Tabelle

SELECT email FROM Registration WHERE email = '[email protected]' 

nur um zu sehen, ob es eine vorhandene Zeile zurückgegeben.

Mit der für diese Spalte in der Tabelle definierten UNIQUE-Einschränkung ist der zurückgegebene Fehler das erwartete Ergebnis, wenn diese Zeile bereits in der Tabelle enthalten ist, und Sie versuchen, eine weitere Zeile mit einem identischen Wert hinzuzufügen.

Ist es möglich, dass Ihr Code zwei (oder mehr) Male die Insert-Anweisung durchläuft?

Sind Sie sicher, dass sich Ihr Code mit demselben MySQL-Server verbindet und dieselben Anmeldeinformationen und dieselbe Datenbank verwendet?

Eine weitere Möglichkeit ist es weniger wahrscheinlich, dass es ein BEFORE INSERT-Trigger für die Tabelle definiert ist, die zu diesem NEW.email Stringwert setzen.

Eine weitere Möglichkeit, insbesondere wenn es sich um MyISAM-Tabellen handelt, ist die Korruption in der Tabelle. Sie könnten die Tabelle löschen und neu erstellen.

Für das Debuggen empfehle ich Ihnen, die Werte der Variablen, die in der Abfrageausführung referenziert werden, insbesondere die E-Mail-Variable, auszugeben/auszudrucken.

+0

Ich habe die gesamte Datenbank und/oder Tabelle gelöscht und umbenannt. Gleiche Ergebnisse. Ich habe nur den Server bei localhost und den Benutzer root definiert. Es ist nicht möglich, dass ich looping, da es keine Schleife in dem gesamten Programm gibt, und das ist der einzige Einfügebefehl, dem ein Ausdruck folgt. Es gibt noch keine Insert-Trigger, die definiert wurden, da die oben angegebene SQL-Anweisung das gesamte Skript zur Datenbankerstellung ist. Die E-Mail-Variable ändert sich definitiv, da die Verwendung eines anderen Werts im HTML-Feld den unterschiedlichen Wert des Fehlers ergibt. Es passiert auch für die Telefonnummer, wenn ich die E-Mail vollständig entferne. – unwrittenrainbow

+0

Nun, das ist der Fehler, den wir bekommen, wenn eine eindeutige Schlüsselbedingung verletzt wird. Mein nächster Vorschlag ist, * die eindeutigen Indizes * zu entfernen und den Code auszuführen. Und dann überprüfen Sie den Inhalt der Tabelle, um zu sehen, ob sie Zeilen enthält. (Ich vermute, Sie werden zwei oder mehr Zeilen finden.) – spencer7593

0

Ich Bit eines Stichs im Dunkeln, aber das Erstellen der Tabelle mit IF NOT EXISTS bedeutet, dass die Tabelle erstellt wird nur, wenn es nicht bereits existiert.

Wenn die Tabelle bereits existiert, und sie Daten z. eine Zeile, in der Spalte Email ist [email protected], wird Ihr Einsatz fehlschlagen.

Der Befehl CREATE TABLE wird sich nicht beschweren, wenn die Tabelle bereits existiert und die Daten aus der vorhandenen Tabelle nicht gelöscht werden. Daher könnten mehrere Ausführungen Ihres Codes den angezeigten Fehler sehr gut erzeugen.

Wenn Sie es sich leisten können, den Tisch zu verlieren, versuchen Sie, ihn fallen zu lassen, bevor Sie die flask-App starten und sehen Sie, ob das Problem weiterhin besteht. Wenn Sie die Daten nicht verlieren, versuchen, die Tabelle umbenennen und starten Sie Ihren Kolben App:

mysql> rename table `ACME`.`Registrations` to `ACME`.`blah`; 
+0

Ich habe die gesamte Datenbank und/oder Tabelle gelöscht (manuell) und umbenannt. Gleiches Ergebnis. – unwrittenrainbow

+0

Aber wann hast du das Problem? Ist es beim ersten Versuch oder einem anschließenden Versuch. Alle Hinweise deuten auf die Wahrscheinlichkeit hin, dass die Tabelle bereits eine Zeile mit der eindeutigen Spalte enthält, daher der Fehler. – mhawke

+0

Sehr erster Versuch. :( – unwrittenrainbow

0

Neu bei HTML/CSS/JS. Es stellte sich heraus, dass mein JS und mein HTML beide die Validierungsfunktion aufgerufen haben, aber ich habe es nicht bemerkt, weil dies das erste Mal (in vielen bisherigen Entwicklungen) war, dass das zweimalige Aufrufen der Funktion einen Fehler verursachen würde. Danke an mhawke und spencer7593, die mich in die richtige Richtung weisen.