我正在尝试处理我的数据库,我刚刚经历了所有麻烦,需要使用将在更新时级联的外键进行改造。但现在,我发现我无法在此表中输入任何行。我一直收到这条消息:
#1452 - 无法添加或更新子行:外键约束失败(testing3
。ouc_breeds
,CONSTRAINT breeds_Species
FOREIGN KEY(Species
)参考nfk_species
(Name
)ON更新CASCADE上的删除级联
现在,我在这个页面上阅读(mysql foreign key error #1452),这意味着“子表中至少有一行引用了父表中不存在的行。”
我收到此消息的最后几次,我意识到我忘记用数据填充父表,因为我最近复制了它,或者我试图在子表中输入的一些数据(或者说我试图留空的列)真的与父表中的任何值都不匹配。
但在这里我感到困惑。父表包含所有条目,子表填充了PHPMyAdmin表单,该表单自动从父表中提取所有外键,并且所有列都相同。发生了什么事?
该错误专门引用了Species外键,因此这里是Parent / Child表的信息。
**表SQL(从导出文件中拉出)**
**Parent Table:**
CREATE TABLE `NFK_Species` (
`Id` int(11) NOT NULL,
`Name` char(255) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `NFK_Species`
ADD PRIMARY KEY (`Id`),
ADD UNIQUE KEY `Name` (`Name`);
**Child Table**
CREATE TABLE `OUC_Breeds` (
`Species` char(255) COLLATE utf8_bin NOT NULL,
`Family` char(255) COLLATE utf8_bin NOT NULL DEFAULT 'N/A',
`Breed_Name` char(255) COLLATE utf8_bin NOT NULL,
`Height` float NOT NULL,
`Weight` int(255) NOT NULL,
`Size_Chart` varchar(255) COLLATE utf8_bin NOT NULL,
`Coat_Length` char(255) COLLATE utf8_bin NOT NULL,
`Coat_Value` char(255) COLLATE utf8_bin NOT NULL,
`Coat_Type` char(255) COLLATE utf8_bin NOT NULL,
`Country_Of_Origin` char(255) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `OUC_Breeds`
ADD UNIQUE KEY `Breed` (`Breed_Name`),
ADD KEY `Species` (`Species`),
ADD KEY `B_Coat_Length` (`Coat_Length`),
ADD KEY `breeds_Coat_V` (`Coat_Value`),
ADD KEY `breeds_Country` (`Country_Of_Origin`),
ADD KEY `breeds_Family_idx` (`Family`);
ALTER TABLE `OUC_Breeds`
ADD CONSTRAINT `breeds_Coat_L` FOREIGN KEY (`Coat_Length`) REFERENCES `nfk_coat_length` (`Length`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `breeds_Coat_V` FOREIGN KEY (`Coat_Value`) REFERENCES `nfk_coat_length` (`Value`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `breeds_Country` FOREIGN KEY (`Country_Of_Origin`) REFERENCES `nfk_countries` (`Country`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `breeds_Family` FOREIGN KEY (`Family`) REFERENCES `ouc_families` (`Family`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `breeds_Species` FOREIGN KEY (`Species`) REFERENCES `nfk_species` (`Name`) ON DELETE CASCADE ON UPDATE CASCADE;
**Enter Data SQL**
INSERT INTO `Testing3`.`OUC_Breeds` (
`Species`, `Family`, `Breed_Name`, `Height`, `Weight`, `Size_Chart`,
`Coat_Length`, `Coat_Value`, `Coat_Type`, `Country_Of_Origin`)
VALUES (
'Dogs', 'N/A', 'Labrador Retriever', '23', '70',
'img.png', '3', 'Short', 'Straight', 'England')
输入字段的IMG
如果有任何其他信息可以帮助您,请告诉我。如果我无法修复此问题,我将无法继续使用我的数据库或网站。
修改:
我只是尝试修改另一个表中的条目,我在那里调整该行的Species信息,然后我又一次得到错误#1452。我的实际Species表可能有问题吗?
编辑2:
建议我为我的表提供样本数据集,所以这里是。
INSERT INTO `NFK_Species` (`Id`, `Name`) VALUES
(1, 'Dogs'),
(2, 'Cats'),
(3, 'Birds'),
(4, 'Rabbits'),
(5, 'Guinea Pigs'),
(6, 'Rats'),
(7, 'Mice'),
(8, 'Gerbil'),
(9, 'Hamster'),
(10, 'Unicorn'),
(11, 'All'),
(12, 'N/A');
INSERT INTO `OUC_Breeds` (`Species`, `Family`, `Breed_Name`, `Height`, `Weight`, `Size_Chart`, `Coat_Length`, `Coat_Value`, `Coat_Type`, `Country_Of_Origin`)
VALUES('Dogs', 'N/A', 'German Shepherd Dog', 25, 80, '/images/size-charts/gsd.png', '3', 'Short', 'Double', 'Germany');
另外,我注意到物种“Key”名称('Species')与约束名称('breeds_Species')不匹配。这会导致问题吗?
编辑3
好的,所以我更新了我的OUC_Breeds.Species键以匹配约束键名,之后#1452错误停止谈论SPECIES列并开始讨论LENGTH列,然后我注意到它不匹配。所以我经历了确保所有KEY名称与CONSTRAINT名称匹配,但现在仍然在我的COAT_VALUE列上得到错误#1452,即使键/约束匹配。我已经仔细检查了列值(两者都是CHAR(255),我试图放入的值存在于Coat_Length表中,我知道我错过了其他的东西。
更新了键/约束
-- Indexes for table `OUC_Breeds`
--
ALTER TABLE `OUC_Breeds`
ADD UNIQUE KEY `Breed` (`Breed_Name`),
ADD KEY `breeds_Coat_V` (`Coat_Value`),
ADD KEY `breeds_Country` (`Country_Of_Origin`),
ADD KEY `breeds_Species` (`Species`) USING BTREE,
ADD KEY `breeds_Coat_L` (`Coat_Length`) USING BTREE,
ADD KEY `breeds_Family` (`Family`) USING BTREE;
-- Constraints for table `OUC_Breeds`
--
ALTER TABLE `OUC_Breeds`
ADD CONSTRAINT `breeds_Coat_L` FOREIGN KEY (`Coat_Length`) REFERENCES `nfk_coat_length` (`Length`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `breeds_Coat_V` FOREIGN KEY (`Coat_Value`) REFERENCES `nfk_coat_length` (`Value`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `breeds_Country` FOREIGN KEY (`Country_Of_Origin`) REFERENCES `nfk_countries` (`Country`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `breeds_Family` FOREIGN KEY (`Family`) REFERENCES `ouc_families` (`Family`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `breeds_Species` FOREIGN KEY (`Species`) REFERENCES `nfk_species` (`Name`) ON DELETE CASCADE ON UPDATE CASCADE;
答案 0 :(得分:1)
以下是导致1452
错误原因的两个原因:
您正在尝试INSERT
新记录到OUC_Breeds
,其中包含父表NFK_Species
中不存在的物种。我意识到你在你的问题中提到你只使用已经存在的主键物种。但是你为什么首先使用ON DELETE CASCADE ON UPDATE CASCADE
?
您的OUC_Breeds
表包含Species
表中不再存在的一个或多个NFK_Species
条目。请记住,即使您在添加约束之前添加了这些条目,MySQL仍将翻身。以下是您可以用来检查第二种可能性的查询:
SELECT DISTINCT Species FROM
OUC_Breeds breeds LEFT JOIN NFK_Species species
ON breeds.Species = species.Name
WHERE species.Name IS NULL;
如果从此查询中返回任何Species
,则表示您的OUC_Breeds
表违反了外键约束。
答案 1 :(得分:1)
在phpMyAdmin和MySQL Workbench之间来回,我意识到在MySQL Workbench上(出于某种原因)我的外键链接到“不存在”的表(它们已被重命名)。我不明白为什么这是一个问题,因为当你从phpMyAdmin(我在这里列出的那些)查看EXPOT SQL时,它引用了具有正确名称的正确表。
所以,总结一下,为了解决我的问题,我不得不:
1。)检查并确保我要输入外键的值实际存在于我的父键中。确保表格不为空或您尝试的值输入没有以某种方式被删除。
2.)检查以确保所有已定义的KEYS的名称与任何相应的CONSTRICTION外键匹配。在我的情况下,我无法简单地重命名它们。我必须删除所有外键和索引并重新签名,以便我的数据库接受它们。
3。)检查以确保外键引用实际存在的表(确保名称拼写正确)。我只能解决这个问题,因为我使用的是两个MySQL程序(PHPMyAdmin和MySQL Workbench)。同样,为了修复它,我不得不删除外键并重新分配它。
所以,你好!我的数据库目前正在运行。我已经浏览了其余的表,这些表使用外键并试图将(进入虚假)行输入到它们中以确保它们正常工作,而且它们确实有效。