Ошибка 150 пытается изменить таблицу
-
25-09-2019 - |
Вопрос
У меня есть этот 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`);
Но я получаю эту ошибку:
Errore Query SQL:
Альтернатива
sedi_i18n
Добавить ограничениеsedi_i18n_FK_1
ВНЕШНИЙ КЛЮЧ (id
) ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРАsedi
(id
) На удалении каскада, добавьте ограничениеsedi_i18n_FK_2
ВНЕШНИЙ КЛЮЧ (culture
) ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРАculture
(code
), Добавьте ограничениеsedi_i18n_FK_3
ВНЕШНИЙ КЛЮЧ (nation
) ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРАnations
(iso_code_2
) ;Messaggio di mysql:
1005 - не может создать таблицу «TEST_JAVIER_4». # SQL-528_AED '(errno: 150)
Есть идеи?
С уважением
Javi.
Решение
Проблема в том, что 2 из ваших 3 внешних ключей относятся к столбцам в родительской таблице, которые не являются ни основными ключами, и у них нет уникального индекса на них.
Все зарубежные ключевые столбцы должны ссылаться либо на первичный ключ или уникальный ключ в родительской таблице.
Это два плохих иностранных ключа:
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`);
Если эти столбцы должны быть уникальными в родительской таблице, вы можете решить это, добавив уникальные индексы на них, как это:
alter table `culture`
add unique key (`code`);
alter table `nations`
add unique key (`iso_code_2`);
Другие советы
1005 (er_cant_create_table)
Не может создать таблицу. Если сообщение об ошибке относится к ошибке 150, создание таблицы не удалось, поскольку ограничение внешнего ключа не было правильно сформировано.
Можете ли вы изолировать, какие из трех настраиваний внешних ключей вызывают ошибку, запустив их по одному? Нравиться:
ALTER TABLE `sedi_i18n`
ADD CONSTRAINT `sedi_i18n_FK_1` FOREIGN KEY (`id`) REFERENCES `sedi` (`id`) ON DELETE CASCADE