Fehler 150 versuchen, eine Tabelle zu ändern
-
25-09-2019 - |
Frage
Ich habe diese SQL-Klauseln:
CREATE TABLE IF NOT EXISTS `culture` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` char(6) NOT NULL DEFAULT 'it',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
CREATE TABLE IF NOT EXISTS `nations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`culture_id` int(11) NOT NULL,
`iso_code_2` char(2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `nations_FI_1` (`culture_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=245 ;
CREATE TABLE IF NOT EXISTS `sedi` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;
CREATE TABLE IF NOT EXISTS `sedi_i18n` (
`id` int(11) NOT NULL,
`culture` char(6) NOT NULL,
`nation` char(2) NOT NULL,
`indirizzo` text NOT NULL,
PRIMARY KEY (`id`,`culture`),
KEY `sedi_i18n_FI_2` (`culture`),
KEY `sedi_i18n_FI_3` (`nation`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `sedi_i18n`
ADD CONSTRAINT `sedi_i18n_FK_1` FOREIGN KEY (`id`) REFERENCES `sedi` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `sedi_i18n_FK_2` FOREIGN KEY (`culture`) REFERENCES `culture` (`code`),
ADD CONSTRAINT `sedi_i18n_FK_3` FOREIGN KEY (`nation`) REFERENCES `nations` (`iso_code_2`);
Aber ich bin gettin dieser Fehler:
Errore SQL-Abfrage:
ALTER TABLE ADD
sedi_i18n
CONSTRAINTsedi_i18n_FK_1
FREMD KEY (id
) REFERENCESsedi
(id
) ON DELETE CASCADE, ADD CONSTRAINTsedi_i18n_FK_2
FREMD KEY (culture
) LITERATURculture
(code
), ADD CONSTRAINTsedi_i18n_FK_3
FOREIGN KEY (nation
) REFERENCESnations
(iso_code_2
);Messaggio di MySQL:
1005 - kann nicht erstellt werden Tisch (errno: 150) 'test_javier_4 # SQL-528_aed.'
Jede Idee?
Viele Grüße
Javi
Lösung
Das Problem ist, dass zwei Ihrer drei Fremdschlüssel Spalten in der übergeordneten Tabelle beziehen, die weder Primärschlüssel sind noch haben sie ihnen einen eindeutigen Index haben.
Alle Fremdschlüsselspalten müssen entweder den Primärschlüssel oder einen eindeutigen Schlüssel in der übergeordneten Tabelle verweisen.
Dies sind die beiden schlechten Fremdschlüssel:
ADD CONSTRAINT `sedi_i18n_FK_2` FOREIGN KEY (`culture`) REFERENCES `culture` (`code`),
ADD CONSTRAINT `sedi_i18n_FK_3` FOREIGN KEY (`nation`) REFERENCES `nations` (`iso_code_2`);
Wenn diese Spalten in der übergeordneten Tabelle eindeutig sein sollen, dann können Sie dieses Problem zu beheben, indem das Hinzufügen eindeutige Indizes auf sie wie folgt aus:
alter table `culture`
add unique key (`code`);
alter table `nations`
add unique key (`iso_code_2`);
Andere Tipps
Von der MySQL Dokumentation :
1005 (ER_CANT_CREATE_TABLE)
Tabelle kann nicht erstellen. Wenn die Fehlermeldung 150 auf Fehler bezieht, Tabellenerstellung ist fehlgeschlagen, da ein Fremdschlüssel wurde nicht richtig ausgebildet ist.
Können Sie isolieren, welche der drei Fremdschlüssel Additionen den Fehler verursacht, indem sie einer nach dem anderen ausgeführt wird? Wie:
ALTER TABLE `sedi_i18n`
ADD CONSTRAINT `sedi_i18n_FK_1` FOREIGN KEY (`id`) REFERENCES `sedi` (`id`) ON DELETE CASCADE