CREATE SCHEMA IF NOT EXISTS universita;

CREATE TABLE IF NOT EXISTS universita.citta (
  codice INT NOT NULL,
  nome VARCHAR(45) NOT NULL,
  provincia VARCHAR(45) NOT NULL,
  regione VARCHAR(45) NOT NULL,
  PRIMARY KEY (codice))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS universita.studente (
  matricola INT NOT NULL,
  cognome VARCHAR(45) NOT NULL,
  nome VARCHAR(45) NOT NULL,
  citta_residenza INT NOT NULL,
  corso_laurea INT NOT NULL,
  PRIMARY KEY (matricola),
  CONSTRAINT fk_corso_laurea
    FOREIGN KEY (corso_laurea)
    REFERENCES universita.corso_laurea (codice)
    ON DELETE RESTRICT
    ON UPDATE CASCADE,
  CONSTRAINT fk_citta
    FOREIGN KEY (citta_residenza)
    REFERENCES universita.citta (codice)
    ON DELETE RESTRICT
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS universita.docente (
  matricola INT NOT NULL,
  cognome VARCHAR(45) NOT NULL,
  nome VARCHAR(45) NOT NULL,
  citta_residenza INT NOT NULL,
  ruolo ENUM('Professore Ordinario', 'Professore Associato', 'Ricercatore') NOT NULL,
  PRIMARY KEY (matricola),
  CONSTRAINT fk_citta
    FOREIGN KEY (citta_residenza)
    REFERENCES universita.citta (codice)
    ON DELETE RESTRICT
    ON UPDATE CASCADE)
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `universita`.`Corso_Laurea` (
  `Codice` INT NOT NULL,
  `Nome` VARCHAR(45) NOT NULL,
  `Tipologia` ENUM('triennale', 'magistrale') NOT NULL,
  `Presidente` INT NOT NULL,
  PRIMARY KEY (`Codice`),
  INDEX `Presidente_idx` (`Presidente` ASC) VISIBLE,
  CONSTRAINT `Presidente_key`
    FOREIGN KEY (`Presidente`)
    REFERENCES `universita`.`Docente` (`Matricola`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

SHOW WARNINGS;

-- -----------------------------------------------------
-- Table `universita`.`Studente`
-- -----------------------------------------------------


SHOW WARNINGS;

-- -----------------------------------------------------
-- Table `universita`.`Corso`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `universita`.`Corso` (
  `Codice` INT NOT NULL,
  `Nome` VARCHAR(45) NOT NULL,
  `Ore_lezione` INT NOT NULL,
  `Ore_esercitazione` INT NULL,
  `Crediti_lezione` INT NOT NULL,
  `Crediti_esercitazione` INT NULL,
  `Docente` INT NOT NULL,
  PRIMARY KEY (`Codice`),
  INDEX `Docente_idx` (`Docente` ASC) VISIBLE,
  CONSTRAINT `Docente_key`
    FOREIGN KEY (`Docente`)
    REFERENCES `universita`.`Docente` (`Matricola`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

SHOW WARNINGS;

-- -----------------------------------------------------
-- Table `universita`.`Esame`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `universita`.`Esame` (
  `Matricola_studente` INT NOT NULL,
  `Codice_corso` INT NOT NULL,
  `Data` DATETIME NOT NULL,
  `Voto` INT NOT NULL,
  PRIMARY KEY (`Matricola_studente`, `Codice_corso`),
  INDEX `Matricola_idx` (`Matricola_studente` ASC) VISIBLE,
  INDEX `Corso_idx` (`Codice_corso` ASC) VISIBLE,
  CONSTRAINT `Matricola_key`
    FOREIGN KEY (`Matricola_studente`)
    REFERENCES `universita`.`Studente` (`Matricola`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `Corso_key`
    FOREIGN KEY (`Codice_corso`)
    REFERENCES `universita`.`Corso` (`Codice`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

SHOW WARNINGS;

-- -----------------------------------------------------
-- Table `universita`.`Corso_Laurea_Corsi`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `universita`.`Corso_Laurea_Corsi` (
  `Codice_Corso_Laurea` INT NOT NULL,
  `Codice_Corso` INT NOT NULL,
  INDEX `CdL_key_idx` (`Codice_Corso_Laurea` ASC) VISIBLE,
  INDEX `Codice_c_key_idx` (`Codice_Corso` ASC) VISIBLE,
  PRIMARY KEY (`Codice_Corso`, `Codice_Corso_Laurea`),
  CONSTRAINT `CdL_key`
    FOREIGN KEY (`Codice_Corso_Laurea`)
    REFERENCES `universita`.`Corso_Laurea` (`Codice`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `Codice_c_key`
    FOREIGN KEY (`Codice_Corso`)
    REFERENCES `universita`.`Corso` (`Codice`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

SHOW WARNINGS;

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