Fehler beim Erstellen eines Fremdschlüssels
-
18-09-2019 - |
Frage
Ich erhalte diesen Fehler, wenn ich versuche, eine ausländische Schlüsselfestigkeit hinzuzufügen:
#1005 - Can't create table './testtable/#sql-595_146.frm' (errno: 150)
Ich muss eine Kaskade löschen für alle Bilder, die eine Projekt -ID teilen, wenn dieses Projekt gelöscht wird. Meine vereinfachte Tabellenstruktur lautet wie folgt:
CREATE TABLE IF NOT EXISTS `images` (
`image_id` mediumint(8) unsigned NOT NULL auto_increment,
`project_id` smallint(6) NOT NULL,
PRIMARY KEY (`image_id`),
KEY `project_id_ix` (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;
CREATE TABLE IF NOT EXISTS `projects` (
`project_id` smallint(5) unsigned NOT NULL auto_increment,
PRIMARY KEY (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
Wenn ich nun die Abfrage unten ausführe, um die Einschränkung hinzuzufügen, fällt die Abfrage mit dem oben angegebenen Fehler aus. Könnte jemand helfen?
ALTER TABLE `images` ADD CONSTRAINT `project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `projects` (`project_id`) ON DELETE CASCADE;
Tausend Dank!
Lösung
Ändere das project_id
Spalten, um die gleiche Größe zu haben smallint(6)
(oder 5). Sie müssen sie auch unterschrieben oder nicht unterschrieben machen.
... von der MySQL -Website heißt es:
Entsprechende Spalten im Fremdschlüssel und in der referenzierten Schlüssel müssen ähnliche interne Datentypen innerhalb von InnoDB aufweisen, damit sie ohne Typumwandlung verglichen werden können. Die Größe und das Zeichen von Ganzzahltypen müssen gleich sein. Die Länge der String -Typen muss nicht gleich sein. Für nicht -binäre (Zeichen-) Stringspalten muss der Zeichensatz und die Kollation gleich sein.
Andere Tipps
Ich dachte, der Datentyp müsse übereinstimmen. project_id ist smallint (6) in einem tisch und smallint (5) in der anderen.
Sollte das Projekt nicht beide sein smallint(6)
?