2016-11-30 13 views
0

私のスキーマで "Examiner"(EX:id 2)を削除しようとしましたが、それをやり遂げられませんでした。親行を削除

この制約が削除にどのように作用するのか教えてください。 私はexaminerを削除するときに、エクサイステーブルの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

これは、2つのテーブルを作成スキーマです。

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スキーマを変更することによって行うことができます。

  • 審査官を削除しないでください。目に見えないものとしてマーキングが十分であるかどうかを確認してください。これには、新しい列としてフラグを追加し、フラグに尊重するためにデータにアクセスするアプリケーションを変更する必要があります。

関連する問題