Erreur 150 essayant de modifier une table
-
25-09-2019 - |
Question
i ont cette clause sql:
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`);
Mais je suis gettin cette erreur:
Errore requête SQL:
ALTER TABLE ADD
sedi_i18n
CONTRAINTE ÉTRANGERsedi_i18n_FK_1
CLÉS (id
) RÉFÉRENCESsedi
(id
) ON CASCADE SUPPRIMER, ADD CONTRAINTE ÉTRANGERsedi_i18n_FK_2
CLÉS (culture
) RÉFÉRENCESculture
(code
), ADD CONTRAINTEsedi_i18n_FK_3
FOREIGN KEY (nation
) RÉFÉRENCESnations
(iso_code_2
);Messaggio di MySQL:
1005 - Impossible de créer la table (errno: 150) 'test_javier_4 # sql-528_aed.
Toute idée?
Cordialement
Javi
La solution
Le problème est que 2 de vos 3 clés étrangères font référence à des colonnes dans la table des parents qui ne sont ni les clés primaires et ils n'ont un index unique sur eux.
Toutes les colonnes clés étrangères doivent référencer la clé primaire ou une clé unique dans la table parent.
Ce sont les deux mauvaises clés étrangères:
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`);
Si ces colonnes sont destinées à être unique dans la table parent, vous pouvez résoudre ce problème en ajoutant des index uniques sur eux comme ceci:
alter table `culture`
add unique key (`code`);
alter table `nations`
add unique key (`iso_code_2`);
Autres conseils
De la documentation MySQL :
1005 (ER_CANT_CREATE_TABLE)
Impossible de créer la table. Si le message d'erreur fait référence à l'erreur 150, la création de la table a échoué en raison d'une contrainte de clé étrangère n'a pas été correctement formée.
Pouvez-vous isoler lequel des trois additions de contrainte de clé étrangère est à l'origine de l'erreur, en les faisant passer un à la fois? Comme:
ALTER TABLE `sedi_i18n`
ADD CONSTRAINT `sedi_i18n_FK_1` FOREIGN KEY (`id`) REFERENCES `sedi` (`id`) ON DELETE CASCADE