当我试图从评估表中删除记录时,我会收到此错误。
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 我必须删除用户的所有数据,包括从这些表中的记录:用户、评估、评估答案。
我可以很容易地删除用户记录,但在删除评估表记录时有上述错误。在评估表之后,我需要删除用户的记录,从评估答案表以及。
你能帮我修一下吗?
我有三个表:评估答案
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 ;评估表:
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 ;和用户表:
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,我就会得到这个,
--
-- 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`);发布于 2017-03-10 08:13:12
这里,assessment是父级,assessment_answer是子级。父母可能有很多孩子。一个孩子只有一个父母。
假设您可以成功地从assessment表中删除记录id 100,那么具有assessment_id为100的assessment_answer表中的所有记录都将变得无效(评估记录id 100已经消失!)数据完整性被破坏。
有两种解决办法:
1)手动,必须先删除assessment_answer记录,然后才能删除assessment记录。换句话说,首先删除与父文件关联的子记录,然后删除父记录。
DELETE FROM assessment_answer WHERE assessment_id = 100
DELETE FROM assessment WHERE id = 1002)从技术上讲,可以让Mysql通过在父-子关系的外部约束上声明ON DELETE CASCADE来处理任务。
ALTER TABLE `assessment_answer`
ADD CONSTRAINT `consAssessmentId` FOREIGN KEY (`assessment_id`) REFERENCES `assessment` (`id`) ON DELETE CASCADE它告诉Mysql删除父数据时总是删除子数据。然后,只执行一个SQL命令来删除两个表中的相关记录。
DELETE FROM assessment WHERE created_by = 14https://stackoverflow.com/questions/42712672
复制相似问题