mysql - 如何使用“删除时=设置空”创建外键?

标签 mysql sql phpmyadmin

已解决:通过从外键中删除主键属性。

我正在为一所学校构建一个 SQL 数据库,以跟踪教师、学生、团体和付款情况。

我已将所有外键设置为在更新时级联(因为我相信这将是最好的方法),但我想在删除时将它们设置为空(即:如果有人删除了一个组,则可以为学生分配到另一个有更新的组),但是当我尝试创建数据库时,服务器在表 grupo 和 grupoalumno 中向我显示此消息:

Error: 150 "Foreign key constraint is incorrectly formed".

我的外键未选中非空(这意味着外键可以为空值),根据我的理解,解决方案是将引用的主键设置为可以为空,这使我问题是 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;

编辑:附加查询以创建数据库。

最佳答案

设置外键约束时,除了更新时级联之外,您还可以定义在删除时设置 null,如下所示:

FOREIGN KEY (Grupo_idGrupo) REFERENCES Grupo (idGrupo) 
ON DELETE SET NULL ON UPDATE CASCADE

关于mysql - 如何使用“删除时=设置空”创建外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53053603/

相关文章:

sql - 使用表名称作为参数调用过程,并将与 PL/SQL 中的表相同的数据类型分配给变量

mysql - 通过 PHPmyadmin 导入 CSV 文件 : file not found or access denied

php - MySQL 存储过程 select 不返回任何内容

sql - 没有 XML 路径的逗号分隔列

mysql - 连接到 Azure 应用服务中的应用中的 MySQL 时出现访问被拒绝错误

php - laravel 5 中的 Multi-Tenancy 应用程序?

php - jQuery multiple get() 从数据库到数组 - 好主意?

PHP MySQL 查询数组帮助

Mysql错误信息:"#1044 - Access denied for user ' root'@'localhost' to database 'information_schema'"当试图删除 TableView

mysql - SQL 语法错误 : Multiple Join Error