[英]How can I make a foreign key with On Delete = Set Null?
已解決:通過從外鍵中刪除主鍵屬性。
我正在為學校建立SQL數據庫,以跟蹤教師,學生,團體和付款情況。
我已經將所有外鍵設置為在更新時級聯(因為我認為這是最好的方法),但是我想在刪除時將它們設置為null(即:如果有人刪除了一個組,則可以將學生分配給另一個組)更新),但是當我嘗試創建數據庫時,服務器會在表grupo和grupoalumno中給我此消息:
錯誤:150“外鍵約束格式不正確”。
我有未選中不為null的外鍵(這意味着外鍵可以為null值),據我了解,解決方案是將被引用的主鍵設置為可以為null,這使我懷疑是否PK為空將是一個好主意。
我也考慮過限制刪除,僅使用更新(即:編輯組直到正確,而不是刪除它),但是我認為能夠真正刪除組而不級聯整個數據庫是明智的。
我正在按照需要的順序創建表(即:不創建引用尚未創建的鍵的表。
我正在使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.