SQL:无法删除或更新父行:外键约束失败

时间:2015-05-27 14:19:46

标签: mysql sql

每当我尝试删除表格中的调查时,#34;调查"像这样:

DELETE FROM surveys WHERE survey_id = 77

它提示我一个错误如下:

  

#1451 - 无法删除或更新父行:外键约束失败(' user_surveys_archive',CONSTRAINT   ' user_surveys_archive_ibfk_6'外键(' user_access_level_id')   参考文献' user_surveys' (' user_access_level_id')ON DELETE NO ACTION   )

第一件事:我没有任何具有此名称的表格" user_surveys_archive_ibfk_6"

第二件事:其他表格中没有此调查的记录。

有关如何删除修复此问题的记录的任何想法?

修改

这是我在导出表调查表约束时找到的行

ALTER TABLE `surveys`
ADD CONSTRAINT `surveys_ibfk_1` FOREIGN KEY (`survey_type_id`) REFERENCES `survey_types` (`survey_type_id`) ON DELETE CASCADE ON UPDATE NO ACTION;`

3 个答案:

答案 0 :(得分:4)

您需要先删除或更新表格中的某些行 user_surveys_archive

这些行与 user_surveys 表中的行相关。

可能,表 user_surveys 上定义了一个外键约束,它引用了您尝试删除的 surveys 中的行。

(您需要检查外键定义,最快的方法是

SHOW CREATE TABLE user_surveys 

寻找REFERENCES surveys。 (可能,它是一个名为survey_id的列,但我们只是猜测而不查看外键约束的定义。)

查找user_surveys_archive中阻止DELETE发生的行...

SELECT a.*
  FROM user_surveys_archvive a
  JOIN user_surveys u
    ON u.user_access_level_id = a.user_access_level_id  
  JOIN surveys s
    ON s.survey_id = u.survey_id    -- change this to whatever the FK is
 WHERE s.survey_id = 77

user_surveyssurveys的外键约束很可能是用ON DELETE CASCADE定义的。尝试从surveys删除行标识user_surveys中应自动删除的行。

尝试从user_surveys自动删除行是违反user_surveys_archive中定义的外键约束的行为。并且该外键是而不是使用ON DELETE CASCADE定义。

(另一种可能性是定义了一个触发器,它正在进行一些DML操作,但这很奇怪。)

确定行后,您需要确定要进行哪些更改,以便从surveys中删除行。

您可以删除行,也可以更新它们。

要从user_surveys_archive删除行,请修改上述查询并将SELECT替换为DELETE。如果user_access_level_id中的user_surveys_archive列允许NULL值,则可以进行更新。

SELECT a.* FROM 替换为 UPDATE ,并在{上方>一行上添加 SET a.user_access_level_id = NULL {1}}条款......

WHERE

(对我来说,外键列的名称是UPDATE user_surveys_archvive a JOIN user_surveys u ON u.user_access_level_id = a.user_access_level_id JOIN surveys s ON s.survey_id = u.survey_id -- change this to whatever the FK is SET a.user_access_level_id = NULL WHERE s.survey_id = 77 似乎很奇怪。但它只是一个列名,它可以被命名为任何东西......由于我们的惯例和模式,我觉得很奇怪按照命名外键列。)

答案 1 :(得分:2)

必须在名为survey_id的表中引用user_surveys_archive 77。错误是说外键约束的名称是user_surveys_archive_ibfk_6。如果您需要删除survey_id = 77,则必须删除任何将其作为外键引用的子记录或其他记录。

编辑在发布我的回答后,我看到了上面的评论。 atif user_surveys_archive表中的外键可能名称不同,但仍等于您尝试删除的值77,和/或引用survey_id。如果不是这种情况,那么数据库中还存在一些其他问题。您可以尝试查看FK的代码以查看它是如何制作的以及它引用的字段,或运行查询以查看user_surveys_archiveuser_access_level_id所在的cuda c++是否有任何记录= 77。

编辑2 spencer7593的回答列出了如何运行我的答案中提到的一些查询。

答案 2 :(得分:2)

您应该允许外键为 NULL ,然后选择 ON DELETE SET NULL

就我个人而言,我建议同时使用“ON UPDATE CASCADE”以及“ON DELETE SET NULL”以避免不必要的复杂情况,但是您的设置可能会采用不同的方法。

希望这有帮助。