Errore 150 tentando di alterare un tavolo
-
25-09-2019 - |
Domanda
ho questo clausole 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`);
Ma io sono gettin questo errore:
Errore query SQL:
ALTER TABLE ADD
sedi_i18n
VINCOLOsedi_i18n_FK_1
STRANIERA CHIAVE (id
) RIFERIMENTIsedi
(id
) ON DELETE CASCADE, ADD VINCOLOsedi_i18n_FK_2
STRANIERA CHIAVE (culture
) RIFERIMENTIculture
(code
), VINCOLO ADDsedi_i18n_FK_3
FOREIGN KEY (nation
) RIFERIMENTInations
(iso_code_2
);Messaggio di MySQL:
1005 - Impossibile creare tabella (errno: 150) 'test_javier_4 # sql-528_aed.'
Qualche idea?
Saluti
Javi
Soluzione
Il problema è che 2 dei tuoi 3 chiavi esterne riferimento alle colonne nella tabella padre che non sono né le chiavi primarie e non hanno un indice univoco su di loro.
Tutte le colonne chiave esterna deve fare riferimento sia la chiave primaria o una chiave univoca nella tabella padre.
Queste sono le due chiavi esterne cattivi:
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`);
Se queste colonne sono destinate ad essere unico nella tabella padre, allora si può risolvere questo con l'aggiunta di indici univoci su di loro in questo modo:
alter table `culture`
add unique key (`code`);
alter table `nations`
add unique key (`iso_code_2`);
Altri suggerimenti
1005 (ER_CANT_CREATE_TABLE)
non può creare la tabella. Se il messaggio di errore si riferisce all'errore 150, creazione di tabelle non riuscita a causa di un vincolo di chiave esterna non è stata formata correttamente.
Si può isolare quale dei tre aggiunte vincolo di chiave esterna causa l'errore, eseguendo uno alla volta? Come:
ALTER TABLE `sedi_i18n`
ADD CONSTRAINT `sedi_i18n_FK_1` FOREIGN KEY (`id`) REFERENCES `sedi` (`id`) ON DELETE CASCADE