2016-11-30 3 views
0

пытался удалить «Examiner» (EX: id 2) в моей схеме, но не позволял мне это делать.Удалить родительскую строку

Не могли бы вы помочь мне и объяснить мне, как это ограничение работает при удалении? Я хочу, когда я удалю экзаменатора, он устанавливает экзамен по таблице упражнений как нуль.

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-схемы на каскадные удаления.

  • Не удаляйте экзаменатора. Проверьте, достаточно ли маркировки как невидимой. Для этого необходимо добавить флаг в качестве нового столбца и изменить приложение (приложения), которые обращаются к данным, чтобы соблюдать флаг.

Смежные вопросы