Нужна помощь со странным, воспроизводимым MySQL ERROR 1452 (23000) Ограничение внешнего ключа - PullRequest
3 голосов
/ 06 апреля 2011

MySQL select version () - 5.5.9 для Mac OS / X 10.6

Вопрос

Когда я выполняю сценарий sql ниже, я сталкиваюсь с очень озадачивающимошибка ограничения внешнего ключа.Кажется, что это не должно бросать эту ошибку.Более того, я знаю, что другие пытались выполнить эти шаги, но не смогли воспроизвести (см .: http://forums.mysql.com/read.php?10,415350,415350#msg-415350)

Кто-нибудь может определить, что мы делаем неправильно?

Воспроизвести:

  1. создать базу данных constraint_test;
  2. создать файл constraint_test.sql и вставить нижеприведенный файл sql.
  3. из строки cmdвыполнить «mysql constraint_test

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

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

"ОШИБКА 1452 (23000) в строке 55:Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (constraint_test. beneficiary, CONSTRAINT FK41BADEC55CE3480 FOREIGN KEY (insured_id) ССЫЛКИ Insured (insured_id)) "

Однако в родительской таблице Insured определенно присутствует insured_id.

Призывпомогите, если сможете!

constraint_test.sql содержимое:

create table Beneficiary ( 
beneficiary_id bigint not null, 
district varchar(255), 
serviceUnit varchar(255), 
insuredNo integer, 
beneficiaryIndex integer, 
relationship varchar(255), 
percentage double precision, 
fullName varchar(255), 
lastUpdatedDate datetime, 
insured_id bigint, 
contractNo varchar(255), 
primary key (beneficiary_id) 
); 

create table Client ( 
client_id bigint not null, 
firstName varchar(255), 
lastName varchar(255), 
email varchar(255), 
initial varchar(255), 
birthDate datetime, 
district varchar(255), 
serviceUnit varchar(255), 
genderType varchar(255), 
externalId varchar(255), 
externalTempId varchar(255), 
taxationProvince varchar(255), 
children varchar(255), 
manufacturerClientNumber varchar(255), 
primary key (client_id) 
); 

create table Insured ( 
insured_id bigint not null, 
client_id bigint not null, 
insuredNo integer, 
primary key (insured_id) 
); 

alter table Beneficiary 
add index FK41BADEC55CE3480 (insured_id), 
add constraint FK41BADEC55CE3480 
foreign key (insured_id) 
references Insured (insured_id); 

alter table Insured 
add index FKD7E770CAC207FE14 (client_id), 
add constraint FKD7E770CAC207FE14 
foreign key (client_id) 
references Client (client_id); 

insert into Client (client_id) values (1); 
insert into Insured (insured_id, client_id ) values (1,1); 
insert into Beneficiary (beneficiary_id, insured_id) values (1,1);

1 Ответ

0 голосов
/ 06 апреля 2011

Ваши типы данных не совпадают точно:
Beneficiary.insured_id равен bigint, тогда как Insured.insured_id bigint not null

Innodb очень обидчив в этом, убедитесь, что ваши определения столбцов FK точно совпадают в обеих таблицах, включая обнуляемость.

...