Ich habe diesen Fehler erhalten, als ich versucht habe, meine Tabelle zu ändern.
Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'
Hier ist meine CREATE TABLE STATEMENT, die erfolgreich ausgeführt wurde.
CREATE TABLE favorite_food(
person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);
Dann habe ich versucht, diese Anweisung auszuführen und ich habe den obigen Fehler erhalten.
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Antworten:
Der Typ und die Definition des Fremdschlüsselfelds und der Referenz müssen gleich sein. Dies bedeutet, dass Ihr Fremdschlüssel das Ändern des Feldtyps nicht zulässt.
Eine Lösung wäre folgende:
Jetzt können Sie Ihre person_id ändern
Fremdschlüssel neu erstellen
BEARBEITEN: Dank Kommentaren wurden oben Sperren hinzugefügt
Ich habe oben eine Schreibsperre hinzugefügt
Alle Schreibanfragen in einer anderen Sitzung als Ihrer eigenen (
INSERT, UPDATE, DELETE
) warten bis zum Timeout oderUNLOCK TABLES
; ausgeführt wirdhttp://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDIT 2: OP bat um eine detailliertere Erläuterung der Zeile "Der Typ und die Definition des Fremdschlüsselfelds und der Referenz müssen gleich sein. Dies bedeutet, dass Ihr Fremdschlüssel das Ändern des Feldtyps nicht zulässt."
Aus MySQL 5.5 Referenzhandbuch: FOREIGN KEY Constraints
quelle
person_id
direkt nach dem Löschen des Fremdschlüssels? Sieht so aus, als hättest du nichts geändert, da es bereits eine istSMALLINT UNSIGNED
.Sie können Fremdschlüsselprüfungen deaktivieren:
Bitte stellen Sie sicher, dass Sie dies NICHT in der Produktion verwenden und ein Backup haben.
quelle
SET FOREIGN_KEY_CHECKS
für die Sitzung gilt (für andere Sitzungen wird weiterhin die FK-Einschränkung angewendet). Es ist perfekt zum Hinzufügen / EntfernenAUTO_INCREMENT
(wodurch der tatsächliche Spaltendatentyp nicht geändert wird), funktioniert jedoch nicht, wenn Sie versuchen, den Spaltendatentyp für "real" (z. B. von SMALLINT in INT) zu ändern, da Sie einen legitimen150 FK constraint incorrectly formed
Zeitpunkt erhalten mysql versucht, die alte Tabelle durch die neue zu ersetzen. Verwenden Sie in diesem Fall die akzeptierte Antwort.Wenn Sie Schlüssel (primäre oder fremde) festlegen, legen Sie Einschränkungen für deren Verwendung fest, was wiederum die Möglichkeiten einschränkt, die Sie damit haben. Wenn Sie die Spalte wirklich ändern möchten, können Sie die Tabelle ohne Einschränkungen neu erstellen, obwohl ich dagegen empfehlen würde. Wenn Sie eine Situation haben, in der Sie etwas tun möchten, die jedoch durch eine Einschränkung blockiert ist, wird dies im Allgemeinen am besten gelöst, indem Sie ändern, was Sie tun möchten, anstatt die Einschränkung.
quelle