Ошибка внешнего ключа MySQL 1005 errno 150 - PullRequest
38 голосов
/ 31 октября 2010

Я делаю небольшую базу данных с MySQL Workbench. У меня есть главная таблица, которая называется «Immobili» и имеет первичный ключ, состоящий из четырех столбцов: (Comune, Via, Civico, Immobile).

Теперь у меня также есть три другие таблицы с одинаковым первичным ключом (Comune, Via, Civico, Immobile), но эти поля также относятся к таблице Immobili.

Первый вопрос: могу ли я создать первичный ключ, который также является внешним ключом?

Второй вопрос: когда я пытаюсь экспортировать изменения, он говорит: Выполнение сценария SQL на сервере

# ERROR: Error 1005: Can't create table 'dbimmobili.condoni' (errno: 150)

CREATE  TABLE IF NOT EXISTS `dbimmobili`.`Condoni` (

  `ComuneImmobile` VARCHAR(50) NOT NULL ,
  `ViaImmobile` VARCHAR(50) NOT NULL ,
  `CivicoImmobile` VARCHAR(5) NOT NULL ,
  `InternoImmobile` VARCHAR(3) NOT NULL ,
  `ProtocolloNumero` VARCHAR(15) NULL ,
  `DataRichiestaSanatoria` DATE NULL ,
  `DataSanatoria` DATE NULL ,
  `SullePartiEsclusive` TINYINT(1) NULL ,
  `SullePartiComuni` TINYINT(1) NULL ,
  `OblazioneInEuro` DOUBLE NULL ,
  `TecnicoOblazione` VARCHAR(45) NULL ,
  `TelefonoTecnico` VARCHAR(15) NULL ,
  INDEX `ComuneImmobile` (`ComuneImmobile` ASC) ,
  INDEX `ViaImmobile` (`ViaImmobile` ASC) ,
  INDEX `CivicoImmobile` (`CivicoImmobile` ASC) ,
  INDEX `InternoImmobile` (`InternoImmobile` ASC) ,

  PRIMARY KEY (`ComuneImmobile`, `ViaImmobile`, `CivicoImmobile`, `InternoImmobile`) ,

  CONSTRAINT `ComuneImmobile`
    FOREIGN KEY (`ComuneImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`ComuneImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT `ViaImmobile`
    FOREIGN KEY (`ViaImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`ViaImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT `CivicoImmobile`
    FOREIGN KEY (`CivicoImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`CivicoImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT `InternoImmobile`
    FOREIGN KEY (`InternoImmobile` )
    REFERENCES `dbimmobili`.`Immobile` (`InternoImmobile` )
    ON DELETE CASCADE
    ON UPDATE CASCADE
) ENGINE = InnoDB

Отображение статуса двигателя:

Ошибка в ограничении внешнего ключа таблицы dbimmobili / valutazionimercato:

Не удается найти индекс в ссылочной таблице, в которой указанные столбцы отображаются как первые столбцы, или столбцы typese в таблице и ссылочной таблице не соответствуют ограничениям. Обратите внимание, что тип внутренней памяти ENUM и SET изменился в таблицах, созданных с помощью> = InnoDB-4.1.12, и на такие столбцы в старых таблицах нельзя ссылаться такими столбцами в новых таблицах.

Где я не так делаю?

Ответы [ 17 ]

50 голосов
/ 31 октября 2010

При создании ограничения внешнего ключа MySQL требует пригодного для использования индекса как для ссылочной таблицы, так и для ссылочной таблицы. Индекс в ссылочной таблице создается автоматически, если он не существует, но индекс в ссылочной таблице необходимо создавать вручную ( Источник ). Ваша, кажется, отсутствует.

Контрольный пример:

CREATE TABLE tbl_a (
    id int PRIMARY KEY,
    some_other_id int,
    value int
) ENGINE=INNODB;
Query OK, 0 rows affected (0.10 sec)

CREATE TABLE tbl_b (
    id int PRIMARY KEY,
    a_id int,
    FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id)
) ENGINE=INNODB;
ERROR 1005 (HY000): Can't create table 'e.tbl_b' (errno: 150)

Но если мы добавим индекс на some_other_id:

CREATE INDEX ix_some_id ON tbl_a (some_other_id);
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

CREATE TABLE tbl_b (
    id int PRIMARY KEY,
    a_id int,
    FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id)
) ENGINE=INNODB;
Query OK, 0 rows affected (0.06 sec)

Это часто не проблема в большинстве ситуаций, так как поле, на которое ссылаются, часто является первичным ключом таблицы, на которую ссылаются, и первичный ключ индексируется автоматически.

30 голосов
/ 31 октября 2010

Дважды проверьте, что внешние ключи имеют тот же тип, что и поле, которое вы получили в этой таблице. Например, оба должны быть Integer (10) или Varchar (8), даже количество символов.

15 голосов
/ 18 апреля 2013

Я понимаю, что это старый пост, но он занимает высокое место в Google, поэтому я добавляю то, что я выяснил для моей проблемы. Если у вас есть сочетание типов таблиц (например, MyISAM и InnoDB), вы также получите эту ошибку. В этом случае InnoDB является типом таблицы по умолчанию, но для одной таблицы необходим полнотекстовый поиск, поэтому она была перенесена в MyISAM. В этой ситуации нельзя создать внешний ключ в таблице InnoDB, которая ссылается на таблицу MyISAM.

9 голосов
/ 12 июня 2013

Если ваш ключ CHAR / VARCHAR или что-то в этом роде, другая возможная проблема - другое сопоставление. Проверьте, совпадает ли кодировка.

6 голосов
/ 15 апреля 2014

У меня была эта ошибка, и я нашел причину ошибки в моем случае.Я все еще отвечаю на этот старый пост, потому что он занимает довольно высокое место в Google.

Переменные обоих столбцов, которые я хотел связать, были целыми числами, но в одном из целых чисел была отмечена опция "unsigned".Просто отменил проверку, чтобы исправить мою ошибку.

5 голосов
/ 22 мая 2012

Я получаю ту же ошибку. Я нашел решение, в котором я создал первичный ключ в основной таблице как BIGINT UNSIGNED и объявил его как внешний ключ во второй таблице только как BIGINT.

Когда я объявил свой внешний ключ как BIGINT UNSIGED во второй таблице, все работало нормально, даже не нужно было создавать индексы.

Итак, это было несоответствие типов данных между первичным ключом и внешним ключом:)

4 голосов
/ 12 марта 2013

У меня была точно такая же проблема, но решение моей проблемы было совершенно другим. Где-то в базе данных у меня был внешний ключ с тем же именем. Это вызвало ошибку 1005.

Переименование моего внешнего ключа во что-то более конкретное в этой ситуации решило проблему.

3 голосов
/ 24 марта 2016

В моем случае ошибка произошла из-за того, что таблица referencing равна MyISAM, где referring таблица была InnoDB.

Converted Таблица движка от MyISAM to InnoDB решает проблему дляя.

ALTER TABLE table_name ENGINE=InnoDB;
3 голосов
/ 30 апреля 2015
  1. Убедитесь, что в обеих таблицах используется один и тот же тип двигателя.
  2. Убедитесь, что индексируемые поля имеют одинаковый тип и длину.
1 голос
/ 20 января 2016

Обратите внимание на параметры CHARSET и COLLATE при создании таблицы. С точки зрения ИНОСТРАННОГО КЛЮЧА проблемы примерно такие:

CREATE TABLE yourTableName (
....
....
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

В моем случае я не мог создать таблицу со ссылками FOREIGN KEY. Сначала я получил код ошибки 1005, который почти ничего не говорит. Затем я добавил COLLATE и наконец сообщение об ошибке с жалобой на CHARSET.

Error Code: 1253. COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'latin1'

После этого исправления моя проблема была решена.

...