每当我尝试删除表格中的调查时,#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;`
答案 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_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
{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_archive
中user_access_level_id
所在的cuda c++
是否有任何记录= 77。
编辑2 spencer7593的回答列出了如何运行我的答案中提到的一些查询。
答案 2 :(得分:2)
您应该允许外键为 NULL ,然后选择 ON DELETE SET NULL 。
就我个人而言,我建议同时使用“ON UPDATE CASCADE”以及“ON DELETE SET NULL”以避免不必要的复杂情况,但是您的设置可能会采用不同的方法。
希望这有帮助。