MySQL – Код ошибки 1215, не может добавить ограничение внешнего ключа

Я получил эти два успешных запроса:

create table Donors ( donor_id int not null auto_increment primary key, gender varchar(1) not null, date_of_birth date not null, first_name varchar(20) not null, middle_name varchar(20), last_name varchar(30) not null, home_phone tinyint(10), work_phone tinyint(10), cell_mobile_phone tinyint(10), medical_condition text, other_details text ); 

а также

 create table Donors_Medical_Condition ( donor_id int not null, condition_code int not null, seriousness text, primary key(donor_id, condition_code), foreign key(donor_id) references Donors(donor_id) ); 

но когда я попробую это:

 create table Medical_Conditions ( condition_code int not null, condition_name varchar(50) not null, condition_description text, other_details text, primary key(condition_code), foreign key(condition_code) references Donors_Medical_Condition(condition_code) ); 

я получаю "Код ошибки: 1215, не могу добавить ограничение внешнего ключа"

Я не знаю, что я делаю неправильно.

В MySql ссылка на внешний ключ должна ссылаться на индекс (включая первичный ключ), где первая часть индекса совпадает с полем внешнего ключа. Если вы создаете индекс на condition_code или изменяете первичный ключ st, что condition_code сначала, вы должны иметь возможность создать индекс.

Чтобы определить foreign key , указанное родительское поле должно иметь указатель, определенный на нем.

Согласно документации по ограничениям foreign key :

ССЫЛКИ tbl_name (index_col_name, …)

Определите INDEX на condition_code в родительской таблице Donors_Medical_Condition и он должен работать.

 create table Donors_Medical_Condition ( donor_id int not null, condition_code int not null, seriousness text, KEY ( condition_code ), -- <---- this is newly added index key primary key(donor_id, condition_code), foreign key(donor_id) references Donors(donor_id) ); 

Но, похоже, вы неправильно определили свой порядок таблиц и ссылок. Вы должны были Donors_Medical_Condition foreign key в таблице Donors_Medical_Condition но не в таблице Donors_Medical_Conditions . Последний кажется родителем .

Измените свой сценарий соответственно.

Они должны быть написаны как:

 -- create parent table first ( general practice ) create table Medical_Conditions ( condition_code int not null, condition_name varchar(50) not null, condition_description text, other_details text, primary key(condition_code) ); -- child table of Medical_Conditions create table Donors_Medical_Condition ( donor_id int not null, condition_code int not null, seriousness text, primary key(donor_id, condition_code), foreign key(donor_id) references Donors(donor_id), foreign key(condition_code) references Donors_Medical_Condition(condition_code) ); 

См .

  • MySQL Использование ограничений FOREIGN KEY

[CONSTRAINT [символ]] ИНОСТРАННЫЙ КЛЮЧ
[index_name] (index_col_name, …)
ССЫЛКИ tbl_name (index_col_name, …)
[ON DELETE reference_option]
[ON UPDATE reference_option]

reference_option:
RESTRICT | КАСКАД | SET NULL | БЕЗДЕЙСТВИЕ

Обходной путь для тех, кто нуждается в быстрой практической работе:
FYI: Моя проблема НЕ была вызвана несогласованностью типов данных / размеров столбцов, сортировки или механизма хранения InnoDB.

Как:
Загрузите Workbench MySQL и используйте его GUI для добавления внешнего ключа. Это оно!

Зачем:
Ошибка имеет отношение к индексам. Я узнал об этом из сценария DML, автоматически созданного с помощью инструментария MySQL. Это также помогло мне исключить все эти возможности несоответствия. Оно относится к одному из условий, к которым относится определение внешнего ключа. То есть: «MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверки внешнего ключа могли быть быстрыми и не требовать сканирования таблицы». Вот официальное утверждение: http://dev.mysql.com/doc/refman/5.7 /en/create-table-foreign-keys.html
У меня не было идеи добавить индекс в столбец внешнего ключа (в дочерней таблице), только обратил внимание на ссылочный столбец ТО (в родительской таблице).
Вот автогенерируемый скрипт (у PHONE.PERSON_ID не было индекса):

 ALTER TABLE `netctoss`.`phone` ADD INDEX `personfk_idx` (`PERSON_ID` ASC); ALTER TABLE `netctoss`.`phone` ADD CONSTRAINT `personfk` FOREIGN KEY (`PERSON_ID`) REFERENCES `netctoss`.`person` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION; 

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

ОБНОВЛЕНО

Хорошо, вы также создаете свои таблицы в неправильном порядке. Вот весь скрипт:

 create table Donors ( donor_id int not null auto_increment primary key, gender varchar(1) not null, date_of_birth date not null, first_name varchar(20) not null, middle_name varchar(20), last_name varchar(30) not null, home_phone tinyint(10), work_phone tinyint(10), cell_mobile_phone tinyint(10), medical_condition text, other_details text ); create table Medical_Conditions ( condition_code int not null, condition_name varchar(50) not null, condition_description text, other_details text, primary key(condition_code) ); create table Donors_Medical_Condition ( donor_id int not null, condition_code int not null, seriousness text, primary key(donor_id, condition_code), foreign key(donor_id) references Donors(donor_id), foreign key(condition_code) references Medical_Conditions(condition_code) ); 

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

SHOW ENGINE INNODB STATUS;

 LATEST FOREIGN KEY ERROR ------------------------ 2015-05-16 00:55:24 12af3b000 Error in foreign key constraint of table letmecall/lmc_service_result_ext: there is no index in referenced table which would contain the columns as the first columns, or the data types in the referenced table do not match the ones in table. Constraint: , CONSTRAINT "fk_SERVICE_RESULT_EXT_LMC_SERVICE_RESULT1" FOREIGN KEY ("FK_SERVICE_RESULT") REFERENCES "LMC_SERVICE_RESULT" ("SERVICE_RESULT") ON DELETE NO ACTION ON UPDATE NO ACTION 

Я удалил все отношения с помощью mysql workbench, но все же вижу ту же ошибку. Проведя несколько минут, я выполняю инструкцию ниже, чтобы увидеть все ограничения, доступные в DB-

выберите * from information_schema.table_constraints, где constraint_schema = 'XXXXX'

Мне было интересно, что я удалил все отношения с помощью mysql workbench, но все же это ограничение было там. И причина в том, что это ограничение уже было создано в db.

Поскольку это была моя тестовая БД, поэтому я сбросил БД, и когда я воссоздал всю таблицу вместе с этой таблицей, тогда это сработало. Таким образом, решение заключалось в том, что это ограничение должно быть удалено из БД перед созданием новых таблиц.

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