2016-10-21 5 views
0

Ich habe 2 Tabellen folgende unten:MySQL-Fehler beim Update Fremdschlüssel

CREATE TABLE `queststatus` (
    `queststatusid` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `characterid` int(11) NOT NULL DEFAULT '0', 
    `quest` int(6) NOT NULL DEFAULT '0', 
    `status` tinyint(4) NOT NULL DEFAULT '0', 
    `time` int(11) NOT NULL DEFAULT '0', 
    `forfeited` int(11) NOT NULL DEFAULT '0', 
    `customData` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`queststatusid`), 
    KEY `characterid` (`characterid`), 
    CONSTRAINT `queststatus_ibfk_1` FOREIGN KEY (`characterid`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=2148654268 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED 

und

CREATE TABLE `queststatusmobs` (
    `queststatusmobid` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `queststatusid` int(10) unsigned NOT NULL DEFAULT '0', 
    `mob` int(11) NOT NULL DEFAULT '0', 
    `count` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`queststatusmobid`), 
    KEY `queststatusid` (`queststatusid`), 
    CONSTRAINT `queststatusmobs_ibfk_1` FOREIGN KEY (`queststatusid`) REFERENCES `queststatus` (`queststatusid`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; 

Also, wenn ich die queststatusid der Tabelle queststatus aktualisieren, verwende ich diesen Befehl, weil die queststatusid erreicht das Maximum von INT:

SET foreign_key_checks = 1; 
SET @newid=0; 
UPDATE queststatus SET queststatusid=(@newid:[email protected]+1) ORDER BY queststatusid; 

Dieser Befehl sollte queststatususid der Tabelle queststatususms chang machen e wenn queststatususid von table queststatus aktualisiert wird, aber nicht. Es zeigt:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`twms`.`queststatus`, CONSTRAINT `queststatus_ibfk_1` FOREIGN KEY (`characterid`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) 

Ich habe alle nutzlos Fremdschlüssel gelöscht, die nicht in queststatus mit diesem Befehl zuerst:

DELETE FROM queststatusmobs WHERE queststatusid not in (SELECT queststatusid FROM queststatus); 

Wie kann ich dieses Problem lösen?

+1

Warum in aller Welt wollen Sie manuell die auto_increment Schlüssel ändern? –

+0

weil der auto_increment Schlüssel das Maximum von INT erreicht, aber ich kann mein Programm nicht ändern. –

+0

Ich glaube nicht, dass Sie das vollständige Bild bereitgestellt haben. Dein Fehler ist gegen die 'Zeichen'-Tabelle, nicht' queststatusmobs'. Ich vermute, du hast Zeilen in 'queststatus' mit falschen IDs für' characterid'. – user2045006

Antwort

0

Sie hatten diese bestimmte ID nicht in Ihrer Zeichentabelle verfügbar.

Zuerst fügen Sie die Zeichen-Tabellen-ID ein und verwenden diese ID als Fremdschlüssel in der Queststatus-Tabelle.

Oder

Entfernen Sie die Fremdschlüssel-Referenz von queststatus.

+0

Ja, ich habe die Zeichentabelle vorher erstellt. aber ich weiß nicht, ob die Zeichentabelle betroffen ist, wenn ich den Queststatus-Tisch aktualisiere? –

+0

queststatus Tabelle haben die Fremdschlüssel der Zeichen Tabelle – Kushan

0

Sie können die ID möglicherweise nicht ändern, wenn Sie einen Fremdschlüssel dagegen haben, da sie umgekehrt validiert. Sie müssen entweder die Fremdschlüsselüberprüfungen deaktivieren oder den Datentyp in BIGINT ändern. Das wird am besten geeignet sein, anstatt zu versuchen, die Daten zu modifizieren.

die Fremdschlüsselprüfung deaktivieren:

SET foreign_key_checks = 0; 

Oder sonst können Sie Löschen und Erstellen der Fremdschlüssel

+0

danke, aber wenn ich SET foreign_key_checks = 0, wird der Fremdschlüssel nicht aktualisiert werden. –

Verwandte Themen