Невозможно создать внешний ключ в базе данных - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь создать таблицу со столбцом varchar в качестве внешнего ключа, но MySQL выдает ошибку при создании таблицы. Мой запрос таков:

CREATE TABLE `survey_hesco_subdivision` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`circle_code` VARCHAR(100) DEFAULT NULL,
`name` VARCHAR(100) DEFAULT NULL,
`circle_name` VARCHAR(100) DEFAULT NULL,
`division_code` VARCHAR(100) DEFAULT NULL,
`sub_div_code` VARCHAR(100) NOT NULL,
`division_name` VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (`id`,`sub_div_code`),
KEY `id` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=91 DEFAULT CHARSET=latin1;

Таблица выше уже используется

Create table `accurate_mam`.`meter_ping`(  
`id` int(11) NOT NULL AUTO_INCREMENT,
`meter_id` int(11) NOT NULL,
`meter_msn` varchar(100),
`sub_div_code` varchar(100) NOT NULL,
`sub_div_name` varchar(100),
primary key (`id`),
constraint `FK_PING_METER_ID` foreign key (`meter_id`) references 
`accurate_mam`.`meters`(`id`) on delete Cascade,
constraint `FK_PIN_SUB_DIV` foreign key (`sub_div_code`) references 
`accurate_mam`.`survey_hesco_subdivision`(`sub_div_code`) on delete Cascade
) ENGINE=InnoDB charset=latin1 collate=latin1_swedish_ci 

Я получаю ошибку

Номер ошибки: 1005 Сообщение об ошибке: не удается создать таблицу accurate_mam. meter_ping (номер ошибки: 150 «Неправильно сформировано ограничение внешнего ключа»)

Я уже изучил этот вопрос

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы уже запускали CREATE TABLE meters? Ошибка вызвана отсутствием этой таблицы. Давайте посмотрим, что CREATE.

0 голосов
/ 30 апреля 2018

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

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

Итак, просто создайте такой индекс, прежде чем создавать дочернюю таблицу:

CREATE INDEX `idx_survey_hesco_subdivision_sub_div_code` ON survey_hesco_subdivision(sub_div_code);

Хотя, не рекомендуется использовать неуникальный столбец в качестве ссылочных столбцов во взаимосвязи. DELETE CASCADE не будет вести себя должным образом в этом случае. Я предлагаю вам также создать уникальный ключ на sub_div_code основной таблицы.

Для получения более подробной информации обратитесь к this

Источник: Невозможно добавить внешний ключ - StackOverflow

...