Ich möchte einer Tabelle namens "katalog" einen Fremdschlüssel hinzufügen.
ALTER TABLE katalog
ADD CONSTRAINT `fk_katalog_sprache`
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;
Wenn ich dies versuche, wird folgende Fehlermeldung angezeigt:
Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150)
Fehler im INNODB-Status:
120405 14:02:57 Fehler in der Fremdschlüsseleinschränkung der Tabelle mytable. # Sql-7fb1_7d3a:
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL:
Cannot resolve table name close to:
(`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL
Wenn ich diese Abfrage verwende, funktioniert sie, aber mit der falschen Aktion "Beim Löschen":
ALTER TABLE `katalog`
ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` )
Beide Tabellen sind InnoDB und beide Felder sind "INT (11) not null". Ich verwende MySQL 5.1.61. Der Versuch, diese ALTER-Abfrage mit MySQL Workbench (neueste Version) auf einem MacBook Pro auszulösen.
Tabellenanweisungen erstellen:
CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`AnzahlSeiten` int(4) unsigned NOT NULL,
`Sprache` int(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `katalogname_uq` (`Name`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$
CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Bezeichnung` varchar(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`),
KEY `ix_sprache_id` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
katalog
hat int(11) unsigned
. sprache
hat das usigned
Teil nicht, daher sind zwei Spalten nicht gleich.
auto_increment
Spalten, was schlecht ist. Außerdem heißt es im MySQL-Handbuch : Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.
. Daher ja, ähnlicher Datentyp und das gleiche Vorzeichen.
SHOW CREATE TABLE
, kann ich nur fragen - ist der Spaltenname wirklich ID, in Großbuchstaben?