我无法理解为什么我在MySQL

时间:2015-07-13 01:10:05

标签: mysql database error-handling

我正在尝试处理我的数据库,我刚刚经历了所有麻烦,需要使用将在更新时级联的外键进行改造。但现在,我发现我无法在此表中输入任何行。我一直收到这条消息:

#1452 - 无法添加或更新子行:外键约束失败(testing3ouc_breeds,CONSTRAINT breeds_Species FOREIGN KEY(Species)参考nfk_speciesName)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

enter image description here

如果有任何其他信息可以帮助您,请告诉我。如果我无法修复此问题,我将无法继续使用我的数据库或网站。

修改:

我只是尝试修改另一个表中的条目,我在那里调整该行的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;

2 个答案:

答案 0 :(得分:1)

以下是导致1452错误原因的两个原因:

  1. 您正在尝试INSERT新记录到OUC_Breeds,其中包含父表NFK_Species中不存在的物种。我意识到你在你的问题中提到你只使用已经存在的主键物种。但是你为什么首先使用ON DELETE CASCADE ON UPDATE CASCADE

  2. 您的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)。同样,为了修复它,我不得不删除外键并重新分配它。

所以,你好!我的数据库目前正在运行。我已经浏览了其余的表,这些表使用外键并试图将(进入虚假)行输入到它们中以确保它们正常工作,而且它们确实有效。