Ошибка 150 при попытке изменить таблицу - PullRequest
0 голосов
/ 17 ноября 2010

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

Но я получаю эту ошибку:

Ошибка запроса SQL:

ALTER TABLE sedi_i18n ADD ОГРАНИЧЕНИЕ 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' (номер ошибки: 150)

Есть идеи?

Привет

1033 * Javi *

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

Проблема в том, что 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`);
0 голосов
/ 17 ноября 2010

Из документации 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
...