2011-04-06 51 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

相关问题