每当我尝试从表“调查”中删除调查时,如下所示:
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)
您需要首先删除或更新表中的一些行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,请修改上面的查询并替换SELECT为DELETE。如果user_access_level_id中的列user_surveys_archive允许 NULL 值,则可以进行更新。
替换SELECT a.* FROM为UPDATE, 并在子句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。但它只是一个列名称,它可以命名为任何名称......对我来说似乎很奇怪,因为我们在命名外键列时遵循的约定和模式。)