2016-11-30 132 views
0

正试图删除我的架构上的“稽查”(EX:id 2),但它不让我这样做。删除父行

你能帮我解释一下这个约束是如何工作的吗? 我想在删除检查者时将exercice表上的examinerId设置为null。

DELETE FROM `examiner` WHERE `examiner`.`id` = 2 LIMIT 1; 


#1451 - Cannot delete or update a parent row: a foreign key constraint fails 
(`codeevaluator`.`exercise`, CONSTRAINT `FK_Exercise_ExaminerId` FOREIGN KEY   
(`examinerId`) REFERENCES `examiner` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) 

enter image description here

这是两个表的创建模式。

CREATE TABLE IF NOT EXISTS `codeevaluator`.`Examiner` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(45) NOT NULL, 
    `username` VARCHAR(45) NOT NULL, 
    `email` VARCHAR(45) NOT NULL, 
    `accountId` BIGINT(20) UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE INDEX `accountId_UNIQUE` (`accountId` ASC), 
    CONSTRAINT `FQ_Examiner_AccountId` 
    FOREIGN KEY (`accountId`) 
    REFERENCES `codeevaluator`.`Account` (`id`) 
    ON DELETE CASCADE) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 


-- ----------------------------------------------------- 
-- Table `codeevaluator`.`Exercise` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `codeevaluator`.`Exercise` ; 

CREATE TABLE IF NOT EXISTS `codeevaluator`.`Exercise` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `examinerId` BIGINT(20) UNSIGNED, 
    `examId` BIGINT(20) UNSIGNED NOT NULL, 
    `examname` VARCHAR(45) NOT NULL, 
    `question` TEXT NOT NULL, 
    `name` VARCHAR(45) NOT NULL, 
    `status` VARCHAR(45) NOT NULL DEFAULT 'O', 
    `progress` INT(10) UNSIGNED NOT NULL DEFAULT '0', 
    `nsubmissions` INT(10) UNSIGNED NOT NULL DEFAULT '0', 
    `weight` INT(10) NOT NULL, 
    `commandbuild` TEXT NULL DEFAULT NULL, 
    `commandrun` TEXT NULL DEFAULT NULL, 
    `path` VARCHAR(100) NULL DEFAULT '/', 
    PRIMARY KEY (`id`), 
    INDEX `FK_Exercise_ExamId_idx` (`examId` ASC), 
    INDEX `FK_Exercise_ExaminerId_idx` (`examinerId` ASC), 
    CONSTRAINT `FK_Exercise_ExamId` 
    FOREIGN KEY (`examId`) 
    REFERENCES `codeevaluator`.`Exam` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `FK_Exercise_ExaminerId` 
    FOREIGN KEY (`examinerId`) 
    REFERENCES `codeevaluator`.`Examiner` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

回答

1

看来考官仍然有练习。约束条件确保永远不会有一个不存在检查员的练习。可能的解决方案如下:

  • 也删除练习。这可以手动完成,也可以通过更改DB模式以级联删除来完成。

  • 请勿删除审查员。检查标记为不可见是否足够。这需要添加一个标志作为新列,并更改访问数据的应用程序以尊重该标志。