2011-04-06 179 views
3

的MySQL版本選擇()援助5.5.9在Mac OS/X 10.6需要不可思議的,可重複的MySQL錯誤1452(23000)外鍵約束

問題

當我執行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 < constraint_test.sql」(或在我的SQL執行 「源TMP/constraint_test.sql」

預期結果:行保存到客戶端,保險和受益表。

實際結果:如您所見,我們始終得到外鍵約束錯誤是類似於:

「ERROR 1452(23000)在第55行:無法添加或upda te子行:外鍵約束失敗(constraint_testbeneficiary,約束FK41BADEC55CE3480外鍵(insured_id)參考文獻Insuredinsured_id))」

但是,肯定是有父表的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); 
+0

輸出的顯示引擎InnoDB的狀態? – ggiroux 2011-04-06 06:32:39

+0

好吧,至少在這裏有一些進展。即使在向Beneficiary.insured的數據類型添加「not null」之後,我們仍然能夠重現錯誤。然而,我們的節目引擎InnoDB的輸出包含以下下最新的外鍵的錯誤:「但父表'constraint_test'.'Insured' 或它的.ibd文件目前不存在」 該表保險確實存在。 – user694157 2011-04-06 19:28:46

+0

非常感謝。我在今天的大部分時間裏都面臨這個確切的問題,然後才發現這個錯誤。如果你使用Hibernate,你可以通過使用ImprovedNamingStrategy類來命名錶而不是默認值來解決這個問題。 – I82Much 2011-05-20 20:32:37

回答

0

您的數據類型不完全匹配:
Beneficiary.insured_id是bigint,而Insured.insured_id bigint not null

Innodb的是非常非常敏感的關於這些,請確保您的FKS列的定義是完全兩個表,其中包括空性同在。

+0

很高興嘗試你的迴應bc它似乎很明顯。不幸的是,即使數據類型完全匹配,也沒有運氣。任何其他建議? – user694157 2011-04-06 19:06:28

+0

看起來像這可能是相關的:http://bugs.mysql.com/bug.php?id=18800 - 你可以嘗試將默認字符集從UTF8更改爲latin1,看看這是否是你的問題。 – ggiroux 2011-04-06 19:45:41

+2

感謝您在正確的方向@ggiroux點! latin1沒有幫助不幸。不過,我確實將表格全部重命名爲小寫,這確實有所作爲。快速搜索表明我應該設置lower_case_table_names = 1,因爲我使用的是InnoDB。在Mac OS/X上它默認是2(我沒有提到我使用了一個新的盒子,這可能是爲什麼它不能在本地工作)。你覺得這有意義嗎? Thx再次爲您提供幫助ggiroux! – user694157 2011-04-06 20:08:26

相關問題