MySQL: сообщение об ошибке Не удается создать таблицу (номер ошибки: 150) - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть две таблицы, 'po' и 'receive'

CREATE TABLE `po` (
  `PO_ID` bigint(20) NOT NULL,
  `SERVICE_TYPE` bit(1) DEFAULT NULL,
  `ENTRY_DATE` date NOT NULL,
  `RECEIPT_DATE` date DEFAULT NULL,
  `TURNOVER` date DEFAULT NULL,
  `MOBILIZATION` date DEFAULT NULL,
  `SITE_NAME` varchar(255) NOT NULL,
  `SITE_CODE` varchar(45) DEFAULT NULL,
  `SITE_TIN` varchar(45) DEFAULT NULL,
  `SITE_ADDRESS` varchar(255) NOT NULL,
  `COST` decimal(11,2) NOT NULL,
  `XML` text,
  PRIMARY KEY (`PO_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

CREATE TABLE `receive` (
  `RECEIPT_ID` varchar(100) NOT NULL,
  `RECEIPT_DATE` date NOT NULL,
  `PO_NUMBER` bigint(20) NOT NULL,
  `SUPPLIER_ID` int(11) NOT NULL,
  PRIMARY KEY (`RECEIPT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

Я пытаюсь соединить две таблицы, определив внешний ключ 'fk_po' для таблицы 'receive'

ALTER TABLE `fourthwave`.`receive` 
  ADD CONSTRAINT `fk_po`
  FOREIGN KEY (`PO_NUMBER` )
  REFERENCES `fourthwave`.`po` (`PO_ID` )
  ON DELETE SET NULL
  ON UPDATE SET NULL
, ADD INDEX `fk_po` (`PO_NUMBER` ASC)

Однако приведенный выше запрос на изменение выдает ошибку:

Error Code: 1005. Can't create table 'fourthwave.#sql-aec_11' (errno:150)

Получаю ли я эту ошибку, поскольку имена полей, 'PO_ID' и 'PO_NUMBER' в обеих таблицах различаются?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2012

Выполните инструкцию SHOW ENGINE INNODB STATUS после ALTER TABLE, и вы увидите сообщение об ошибке: «Вы определили условие SET NULL, хотя некоторые столбцы определены как NOT NULL».

ALTER TABLE `receive` 
  ADD CONSTRAINT `fk_po`
  FOREIGN KEY (`PO_NUMBER` )
  REFERENCES `po` (`PO_ID` )
  ON DELETE SET NULL
  ON UPDATE SET NULL
 , ADD INDEX `fk_po` (`PO_NUMBER` ASC);

SHOW ENGINE INNODB STATUS;
0 голосов
/ 27 февраля 2012

Вам нужен индекс для PO_NUMBER в таблице receive. Поле, на которое вы ссылаетесь во внешнем ключе, всегда должно быть проиндексировано.

...