首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于mysql中的限制,无法从表中删除记录

问由于mysql中的限制,无法从表中删除记录
EN

Stack Overflow用户
提问于 2017-03-10 07:28:41
回答 1查看 55关注 0票数 0

当我试图从评估表中删除记录时,我会收到此错误。

代码语言:javascript
复制
 Cannot delete or update a parent row: a foreign key constraint fails (`assessment`.`assessment_answer`, CONSTRAINT `consAssessmentId` FOREIGN KEY (`assessment_id`) REFERENCES `assessment` (`id`)). The SQL statement executed was: DELETE FROM `assessment` WHERE created_by=14 

我必须删除用户的所有数据,包括从这些表中的记录:用户、评估、评估答案。

我可以很容易地删除用户记录,但在删除评估表记录时有上述错误。在评估表之后,我需要删除用户的记录,从评估答案表以及。

你能帮我修一下吗?

我有三个表:评估答案

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `assessment_answer` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `assessment_id` int(10) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  `question_id` int(10) DEFAULT NULL,
  `answer_value` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `question_id` (`question_id`),
  KEY `assessment_id` (`assessment_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=200 ;

评估表:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `assessment` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `link` varchar(255) DEFAULT NULL,
  `created_by` int(10) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `created_by_2` (`created_by`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

和用户表:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) DEFAULT NULL,
  `status` enum('0','1','2') NOT NULL DEFAULT '1' COMMENT '0: Inactive, 1: Active, 2: Deleted',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

如果我放弃SQL,我就会得到这个,

代码语言:javascript
复制
--
-- Constraints for table `assessment_answer`
--
ALTER TABLE `assessment_answer`
  ADD CONSTRAINT `consAssessmentId` FOREIGN KEY (`assessment_id`) REFERENCES `assessment` (`id`),
  ADD CONSTRAINT `consQuestionId` FOREIGN KEY (`question_id`) REFERENCES `questions` (`id`);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-10 08:13:12

这里,assessment是父级,assessment_answer是子级。父母可能有很多孩子。一个孩子只有一个父母。

假设您可以成功地从assessment表中删除记录id 100,那么具有assessment_id为100的assessment_answer表中的所有记录都将变得无效(评估记录id 100已经消失!)数据完整性被破坏。

有两种解决办法:

1)手动,必须先删除assessment_answer记录,然后才能删除assessment记录。换句话说,首先删除与父文件关联的子记录,然后删除父记录。

代码语言:javascript
复制
DELETE FROM assessment_answer WHERE assessment_id = 100
DELETE FROM assessment WHERE id = 100

2)从技术上讲,可以让Mysql通过在父-子关系的外部约束上声明ON DELETE CASCADE来处理任务。

代码语言:javascript
复制
ALTER TABLE `assessment_answer`
ADD CONSTRAINT `consAssessmentId` FOREIGN KEY (`assessment_id`) REFERENCES `assessment` (`id`) ON DELETE CASCADE

它告诉Mysql删除父数据时总是删除子数据。然后,只执行一个SQL命令来删除两个表中的相关记录。

代码语言:javascript
复制
DELETE FROM assessment WHERE created_by = 14
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42712672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档