2012-08-29 6 views
25

Ich habe die folgende Tabelle in MySQL Version 5.5.24MySQL 1062 - doppelter Eintrag '0' für Schlüssel 'primären'

DROP TABLE IF EXISTS `momento_distribution`; 

CREATE TABLE IF NOT EXISTS `momento_distribution` 
    (
    `momento_id`  INT(11) NOT NULL, 
    `momento_idmember` INT(11) NOT NULL, 
    `created_at`  DATETIME DEFAULT NULL, 
    `updated_at`  DATETIME DEFAULT NULL, 
    `unread`   TINYINT(1) DEFAULT '1', 
    `accepted`   VARCHAR(10) NOT NULL DEFAULT 'pending', 
    `ext_member`  VARCHAR(255) DEFAULT NULL, 
    PRIMARY KEY (`momento_id`, `momento_idmember`), 
    KEY `momento_distribution_FI_2` (`momento_idmember`), 
    KEY `accepted` (`accepted`, `ext_member`) 
) 
ENGINE=InnoDB 
DEFAULT CHARSET=latin1; 

Es hat viele Daten mit many-to-one Beziehungen zu zwei anderen Tabellen mit ondelete=restrict und onupdate=restrict.

Jetzt muss ich die Struktur ändern und separaten Primärschlüssel in der Tabelle einführen, während noch vorhandene Beziehungen und Daten beibehalten werden. Dafür ausgeführt ich die folgende Abfrage:

ALTER TABLE `momento_distribution` ADD `id` INT(11) NOT NULL FIRST; 
ALTER TABLE `momento_distribution` DROP PRIMARY KEY , ADD PRIMARY KEY ( `id`); 

Leider meine zweite Abfrage mit dem folgenden Fehler fehlgeschlagen:

1062 - Duplicate entry '0' for key 'PRIMARY'

Kann jemand bitte das Problem hinweisen? Ich vermute, dass das Problem die bestehende Beziehung ist, aber ich möchte die bestehende Beziehung oder Daten, die mehrere tausend Zeilen haben, nicht verlieren. Gibt es eine Möglichkeit, dies zu tun, ohne Daten zu verlieren?

EDIT: Durch Anzeigen von Daten, habe ich, dass die neu erstellte Spalte den Wert '0' drin hat. Wahrscheinlich erlaubt dies nicht, den Primärschlüssel aufgrund von doppelten Datensätzen zu ändern (im neuen Primärschlüssel)

Ich habe mehr als 8.000 Zeilen, daher kann ich sie nicht manuell ändern. Gibt es eine Möglichkeit, rowid einem neuen Primärschlüssel zuzuordnen?

Antwort

13

Führen Sie die folgende Abfrage in der MySQL-Konsole aus:

SHOW CREATE TABLE momento_distribution 

prüfen für die Linie, dass es sein kann, etwas anderes wie

CONSTRAINT `momento_distribution_FK_1` FOREIGN KEY (`momento_id`) REFERENCES `momento` (`id`) 

sieht, ich habe nur eine Vermutung, was es sein könnte. Wenn Sie eine foreign key auf beiden 'momento_id' & 'momento_idmember' haben, erhalten Sie zwei fremde Schlüsselnamen. Der nächste Schritt besteht darin, die Fremdschlüssel zu löschen. Führen Sie die folgenden Abfragen:

ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_1 
ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_2 

Achten Sie darauf, den Fremdschlüssel Namen zu ändern, was Sie von der CREATE TABLE Abfrage bekam. Jetzt haben Sie keine Fremdschlüssel, so dass Sie die primary key einfach entfernen können. Versuchen Sie Folgendes:

ALTER TABLE `momento_distribution` DROP PRIMARY KEY 

die gewünschte Spalte hinzufügen wie folgt:

ALTER TABLE `momento_distribution` ADD `id` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST 

Diese Abfrage auch Zahlen addiert, so dass Sie nicht auf @rowid abhängen müssen. Jetzt müssen Sie den Fremdschlüssel zu den früheren Spalten hinzufügen.Dazu machen Sie zuerst diese Indizes:

ALTER TABLE `momento_distribution` ADD INDEX ( `momento_id`) 
ALTER TABLE `momento_distribution` ADD INDEX ( `momento_idmember`) 

Fügen Sie nun die Fremdschlüssel hinzu. Ändern Sie die Referenztabelle/Spalte, wie Sie benötigen:

ALTER TABLE `momento_distribution` ADD FOREIGN KEY (`momento_id`) REFERENCES `momento` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT 
ALTER TABLE `momento_distribution` ADD FOREIGN KEY (`momento_idmember`) REFERENCES `member` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT 

Hoffe, dass hilft. Wenn Sie Fehler bekommen, bearbeiten Sie bitte die Frage mit der Struktur der Referenztabellen & die Fehlercodes, die Sie erhalten.

+0

weggelassen Dank @Youthpark, ich versuche diese Abfragen und in den nächsten 10 Minuten max. Danke für die Hilfe. Ich bin wirklich frustriert über dieses Problem. –

+1

Im Falle eines Problems, kommen Sie mit Struktur aller Tabellen & mit Fehlercode. –

+1

Endlich erledigt. Ich steckte seit gestern dort fest. Danke vielmals. –

43

Sie müssen den Primärschlüssel als Autoinkrement

CREATE TABLE `momento_distribution` 
    (
    `momento_id`  INT(11) NOT NULL AUTO_INCREMENT, 
    `momento_idmember` INT(11) NOT NULL, 
    `created_at`  DATETIME DEFAULT NULL, 
    `updated_at`  DATETIME DEFAULT NULL, 
    `unread`   TINYINT(1) DEFAULT '1', 
    `accepted`   VARCHAR(10) NOT NULL DEFAULT 'pending', 
    `ext_member`  VARCHAR(255) DEFAULT NULL, 
    PRIMARY KEY (`momento_id`, `momento_idmember`), 
    KEY `momento_distribution_FI_2` (`momento_idmember`), 
    KEY `accepted` (`accepted`, `ext_member`) 
) 
ENGINE=InnoDB 
DEFAULT CHARSET=latin1$$ 

Im Hinblick auf die unten näher zu kommentieren, wie etwa:

ALTER TABLE `momento_distribution` 
    CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT, 
    DROP PRIMARY KEY, 
    ADD PRIMARY KEY (`id`); 

ein Primärschlüssel ist ein eindeutiger Index, also wenn es enthält Duplikate, Sie können die Spalte nicht dem eindeutigen Index zuordnen, daher müssen Sie möglicherweise eine neue Spalte erstellen

+0

Danke Merca, aber ich gab obige Abfrage nur als Hinweis auf Tabellenstruktur. Ich erstelle keine neue Tabelle. Ich habe bereits eine Tabelle mit vielen Zeilen, so nur die Abfrage ändern ist die Option. Derzeit sind momento_id & momento_idmember Fremdschlüssel und zusammengesetzter Schlüssel. Ich muss sie als Primärschlüssel entfernen und neue Spalte als Primärschlüssel einführen. –

+0

Sorry aber bearbeiten wird auch nicht funktionieren. 'momento_id' ist zusammen mit' momento_idmember' bereits der Primärschlüssel. Ich brauche eine neue Spalte als Primärschlüssel. Überprüfen Sie meinen Beitrag, ich habe die Spalte bereits erfolgreich mit der Abfrage hinzugefügt ** ALTER TABLE 'momento_distribution' ADD' id' INT (11) NOT NULL FIRST; **. Jetzt müssen Sie es als primäre machen. –

+0

Ein PRIMARY KEY ist ein eindeutiger Index. Wenn er also Duplikate enthält, können Sie die Spalte keinem eindeutigen Index zuordnen. Daher müssen Sie möglicherweise eine neue Spalte erstellen. – Miroslav

9

überprüfen, ob Ihr Feld mit dem Primärschlüssel Autoinkrement gesetzt

1

dieser Schritt arbeiten perfekt für mich .. Sie können es versuchen

  1. hinzufügen Indizierung
  2. hinzufügen Autoincrement
  3. hinzufügen Primärschlüssel

hoffe, es funktioniert auch für Sie. Viel Glück