Chcę dodać klucz obcy do tabeli o nazwie „katalog”.
ALTER TABLE katalog
ADD CONSTRAINT `fk_katalog_sprache`
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;
Gdy próbuję to zrobić, pojawia się następujący komunikat o błędzie:
Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150)
Błąd w stanie INNODB:
120405 14:02:57 Błąd ograniczenia klucza obcego tabeli 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
Kiedy korzystam z tego zapytania, działa, ale ze złym działaniem „przy usuwaniu”:
ALTER TABLE `katalog`
ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` )
Obie tabele to InnoDB, a oba pola to „INT (11) nie null”. Używam MySQL 5.1.61. Próba uruchomienia tego zapytania ALTER za pomocą MySQL Workbench (najnowszego) na MacBooku Pro.
Tabela Utwórz instrukcje:
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
ma int(11) unsigned
. sprache
nie ma usigned
części, dlatego dwie kolumny nie są takie same.
auto_increment
kolumn, co jest złe. Ponadto, instrukcja MySQL mówi: 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.
. Dlatego tak, podobny typ danych i ten sam znak.
SHOW CREATE TABLE
, mogę tylko zapytać - czy nazwa kolumny to naprawdę ID, wielkie litery?