Вопрос

У меня есть этот 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`);

Другие советы

Из MySQL Документация:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top