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

ati*_*tif 4 mysql sql

每当我尝试从表“调查”中删除调查时,如下所示:

DELETE FROM surveys WHERE survey_id = 77

它提示我一个错误,如下所示:

#1451 - 无法删除或更新父行:外键约束失败('user_surveys_archive',CONSTRAINT 'user_surveys_archive_ibfk_6' FOREIGN KEY ('user_access_level_id') REFERENCES '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;`
Run Code Online (Sandbox Code Playgroud)

spe*_*593 5

您需要首先删除或更新表中的一些行user_surveys_archive

这些行与表中的行相关user_surveys

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

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

SHOW CREATE TABLE user_surveys 
Run Code Online (Sandbox Code Playgroud)

并寻找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
Run Code Online (Sandbox Code Playgroud)

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

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

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


识别行后,您需要决定进行哪些更改以允许您从 中删除行surveys

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

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

替换SELECT a.* FROMUPDATE, 并在子句SET a.user_access_level_id = NULL上方添加一行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
Run Code Online (Sandbox Code Playgroud)

(对我来说,外键列的名称是 似乎很奇怪user_access_level_id。但它只是一个列名称,它可以命名为任何名称......对我来说似乎很奇怪,因为我们在命名外键列时遵循的约定和模式。)