Как сделать внешний ключ с помощью On Delete = Set Null? - PullRequest
0 голосов
/ 29 октября 2018

решено: путем удаления атрибута первичного ключа из внешних ключей.

Я создаю базу данных SQL для школы, чтобы отслеживать учителей, учащихся, группы и выплаты.

Я установил все внешние ключи каскадно при обновлении (поскольку я считаю, что это будет наилучшим способом), но я хочу установить для них значение null при удалении (то есть: если кто-то удаляет группу, ученикам можно назначить в другую группу с обновлением), но сервер выдает мне это сообщение в таблицах grupo и grupoalumno, когда я пытаюсь создать базу данных:

Ошибка: 150 «Ограничение внешнего ключа сформировано неправильно».

У меня есть внешние ключи с ненулевым непроверенным (что означает, что внешний ключ может быть нулевым значением), и, как я понял, решение состоит в том, чтобы установить первичные ключи, на которые ссылаются, как возможность быть нулевым, что заставляет меня вопрос, будет ли хорошей идеей иметь нулевой PK.

Я также рассмотрел вопрос об ограничении удаления и использовании только обновлений (т. Е. Редактирование группы до тех пор, пока она не будет права, а не удаление), но я думаю, что было бы целесообразно на самом деле удалить группу без каскадирования всей базы данных.

Я создаю таблицы в том порядке, в котором они должны быть (то есть: не создаю таблицу, которая ссылается на ключ, который еще не был создан. Database Model

Я использую PHPMyAdmin и MySQL Workbench. Я считаю, что MySQL экспортирует базу данных с InnoDB в качестве движка.

Надеюсь, я объяснил себе. Заранее спасибо. Надеюсь многому научиться!

Код:

-- MySQL Script generated by MySQL Workbench
-- 10/29/18 21:25:26
-- Model: New Model    Version: 1.0
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema celex
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `celex` DEFAULT CHARACTER SET utf8 COLLATE utf8_spanish_ci ;
USE `celex` ;

-- -----------------------------------------------------
-- Table `celex`.`Grupo`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `celex`.`Grupo` (
  `idGrupo` INT NOT NULL AUTO_INCREMENT,
  `idioma` VARCHAR(45) NOT NULL,
  `nivel` VARCHAR(45) NOT NULL,
  `horarioInicio` TIME NULL,
  `horarioTermino` TIME NULL,
  PRIMARY KEY (`idGrupo`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `celex`.`Alumno`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `celex`.`Alumno` (
  `idAlumno` INT NOT NULL AUTO_INCREMENT,
  `nombre` VARCHAR(45) NOT NULL,
  `primerApellido` VARCHAR(45) NOT NULL,
  `segundoApellido` VARCHAR(45) NOT NULL,
  `email` VARCHAR(45) NOT NULL,
  `telefono` VARCHAR(45) NULL,
  `edad` INT NULL,
  `procedencia` VARCHAR(45) NULL,
  `fechaIngreso` DATE NOT NULL,
  `nivelIngreso` VARCHAR(45) NOT NULL,
  `moduloIngreso` INT NOT NULL,
  `nivelColocacion` VARCHAR(45) NULL,
  `moduloColocacion` INT NULL,
  PRIMARY KEY (`idAlumno`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `celex`.`Periodo`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `celex`.`Periodo` (
  `idPeriodo` INT NOT NULL AUTO_INCREMENT,
  `nombre` VARCHAR(45) NULL,
  `inicio` DATE NOT NULL,
  `termino` DATE NOT NULL,
  PRIMARY KEY (`idPeriodo`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `celex`.`GrupoAlumno`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `celex`.`GrupoAlumno` (
  `idGrupoAlumno` INT NOT NULL AUTO_INCREMENT,
  `modulo` INT NOT NULL,
  `calificacionParcial` DOUBLE NULL,
  `calificacionFinal` DOUBLE NULL,
  `calificacionExtra` DOUBLE NULL,
  `Periodo_idPeriodo` INT NULL,
  `Grupo_idGrupo` INT NULL,
  `Alumno_idAlumno` INT NULL,
  PRIMARY KEY (`idGrupoAlumno`, `Periodo_idPeriodo`, `Grupo_idGrupo`, `Alumno_idAlumno`),
  INDEX `fk_Grupo_has_Alumno_Alumno1_idx` (`Alumno_idAlumno` ASC),
  INDEX `fk_Grupo_has_Alumno_Grupo_idx` (`Grupo_idGrupo` ASC),
  INDEX `fk_GrupoAlumno_Periodo1_idx` (`Periodo_idPeriodo` ASC),
  CONSTRAINT `fk_Grupo_has_Alumno_Grupo`
    FOREIGN KEY (`Grupo_idGrupo`)
    REFERENCES `celex`.`Grupo` (`idGrupo`)
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `fk_Grupo_has_Alumno_Alumno1`
    FOREIGN KEY (`Alumno_idAlumno`)
    REFERENCES `celex`.`Alumno` (`idAlumno`)
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `fk_GrupoAlumno_Periodo1`
    FOREIGN KEY (`Periodo_idPeriodo`)
    REFERENCES `celex`.`Periodo` (`idPeriodo`)
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `celex`.`PeriodoAlumno`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `celex`.`PeriodoAlumno` (
  `idPeriodoAlumno` INT NOT NULL AUTO_INCREMENT,
  `cuota` TINYINT(1) NULL,
  `Periodo_idPeriodo` INT NULL,
  `Alumno_idAlumno` INT NULL,
  PRIMARY KEY (`idPeriodoAlumno`, `Periodo_idPeriodo`, `Alumno_idAlumno`),
  INDEX `fk_Periodo_has_Alumno_Alumno1_idx` (`Alumno_idAlumno` ASC),
  INDEX `fk_Periodo_has_Alumno_Periodo1_idx` (`Periodo_idPeriodo` ASC),
  CONSTRAINT `fk_Periodo_has_Alumno_Periodo1`
    FOREIGN KEY (`Periodo_idPeriodo`)
    REFERENCES `celex`.`Periodo` (`idPeriodo`)
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `fk_Periodo_has_Alumno_Alumno1`
    FOREIGN KEY (`Alumno_idAlumno`)
    REFERENCES `celex`.`Alumno` (`idAlumno`)
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `celex`.`Maestro`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `celex`.`Maestro` (
  `idMaestro` INT NOT NULL AUTO_INCREMENT,
  `nombre` VARCHAR(45) NOT NULL,
  `primerApellido` VARCHAR(45) NOT NULL,
  `segundoApellido` VARCHAR(45) NOT NULL,
  `email` VARCHAR(45) NOT NULL,
  `telefono` VARCHAR(45) NULL,
  PRIMARY KEY (`idMaestro`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `celex`.`GrupoMaestro`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `celex`.`GrupoMaestro` (
  `idGrupoMaestro` INT NOT NULL AUTO_INCREMENT,
  `Grupo_idGrupo` INT NULL,
  `Maestro_idMaestro` INT NULL,
  PRIMARY KEY (`idGrupoMaestro`, `Grupo_idGrupo`, `Maestro_idMaestro`),
  INDEX `fk_Grupo_has_Maestro_Maestro1_idx` (`Maestro_idMaestro` ASC),
  INDEX `fk_Grupo_has_Maestro_Grupo1_idx` (`Grupo_idGrupo` ASC),
  CONSTRAINT `fk_Grupo_has_Maestro_Grupo1`
    FOREIGN KEY (`Grupo_idGrupo`)
    REFERENCES `celex`.`Grupo` (`idGrupo`)
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `fk_Grupo_has_Maestro_Maestro1`
    FOREIGN KEY (`Maestro_idMaestro`)
    REFERENCES `celex`.`Maestro` (`idMaestro`)
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

edit: добавление запроса для создания базы данных.

1 Ответ

0 голосов
/ 30 октября 2018

При установке ограничения внешнего ключа, в дополнение к каскаду при обновлении, вы можете определить, что при удалении нужно установить значение null следующим образом:

FOREIGN KEY (Grupo_idGrupo) REFERENCES Grupo (idGrupo) 
ON DELETE SET NULL ON UPDATE CASCADE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...