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!

War es hilfreich?

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)?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top