dotfiles/.local/share/db_ui/root@localhost/bfc.sql

235 lines
8.1 KiB
SQL

-- MySQL Workbench Forward Engineering
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='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- -----------------------------------------------------
-- Schema biblioteca_fc
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `biblioteca_fc` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;
USE `biblioteca_fc` ;
-- DROP DATABASE `biblioteca_fc`;
-- -----------------------------------------------------
-- Table `biblioteca_fc`.`Funcionario`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteca_fc`.`Funcionario` (
`id` INT NOT NULL AUTO_INCREMENT,
`contacto_emergencia` VARCHAR(13) NOT NULL,
`telefone` VARCHAR(9) NOT NULL CHECK (`telefone` REGEXP "[0-9]{9}") ,
`cc` VARCHAR(8) NOT NULL UNIQUE CHECK (`cc` REGEXP "[0-9]{8}"),
`email` VARCHAR(100) NOT NULL CHECK ( `email` REGEXP ".+@.+" ),
`dta_nascimento` DATE NOT NULL,
`nome` VARCHAR(60) NOT NULL,
`dta_fim_servico` DATE NULL DEFAULT NULL,
`dta_inicio_servico` DATE NOT NULL,
`codigo_postal` CHAR(8) NOT NULL CHECK ( `codigo_postal` REGEXP "[0-9]{4}\-[0-9]{3}" ),
`morada` VARCHAR(60) NOT NULL,
`cidade` VARCHAR(25) NOT NULL,
PRIMARY KEY (`id`));
-- -----------------------------------------------------
-- Table `biblioteca_fc`.`Livro`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteca_fc`.`Livro` (
`ISBN` CHAR(13) NOT NULL CHECK( `ISBN` REGEXP "[0-9]{13}"),
`autor` VARCHAR(50) NOT NULL,
`editora` VARCHAR(45) NOT NULL,
`titulo` VARCHAR(50) NOT NULL,
`localizacao` CHAR(3) NULL CHECK (`localizacao` REGEXP "[0-9]{3}"),
`paginas` INT NULL CHECK(`paginas` > 0),
`dta_publicacao` DATE NULL,
PRIMARY KEY (`ISBN`));
-- -----------------------------------------------------
-- Table `biblioteca_fc`.`Genero`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteca_fc`.`Genero` (
`id` INT NOT NULL AUTO_INCREMENT,
`descricao` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`));
-- -----------------------------------------------------
-- Table `biblioteca_fc`.`LivroGenero`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteca_fc`.`LivroGenero` (
`Livro` CHAR(13) NOT NULL,
`Genero` INT NOT NULL,
PRIMARY KEY (`Livro`, `Genero`),
CONSTRAINT `fk_LivroGenero_Livro1`
FOREIGN KEY (`Livro`)
REFERENCES `biblioteca_fc`.`Livro` (`ISBN`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_LivroGenero_Genero1`
FOREIGN KEY (`Genero`)
REFERENCES `biblioteca_fc`.`Genero` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
-- -----------------------------------------------------
-- Table `biblioteca_fc`.`Utilizador`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteca_fc`.`Utilizador` (
`id` INT NOT NULL AUTO_INCREMENT,
`cc` CHAR(8) NOT NULL UNIQUE CHECK (`cc` REGEXP "[0-9]{8}"),
`email` VARCHAR(100) NOT NULL,
`data_de_nascimento` DATE NOT NULL,
`telefone` VARCHAR(9) NOT NULL CHECK (`telefone` REGEXP "[0-9]{9}"),
`nome` VARCHAR(60) NOT NULL,
`morada` VARCHAR(60) NOT NULL,
`codigo_postal` CHAR(8) NOT NULL CHECK ( `codigo_postal` REGEXP "[0-9]{4}\-[0-9]{3}" ),
`cidade` VARCHAR(25) NOT NULL,
PRIMARY KEY (`id`));
-- -----------------------------------------------------
-- Function idade
-- -----------------------------------------------------
DELIMITER //
CREATE FUNCTION idade(data_de_nascimento date) RETURNS int DETERMINISTIC
BEGIN
RETURN (SELECT DATEDIFF(data_de_nascimento,CURDATE()));
END
// DELIMITER ;
-- -----------------------------------------------------
-- Table `biblioteca_fc`.`Exemplar`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteca_fc`.`Exemplar` (
`id` INT NOT NULL AUTO_INCREMENT,
`condicao` CHAR(1) NOT NULL DEFAULT 'I' CHECK (`condicao` IN ('S', 'A', 'B', 'C', 'D','I')), -- Condição baseada no sistema de notas americanas
`disponibilidade` CHAR(1) NOT NULL DEFAULT 'D' CHECK (`disponibilidade` IN ('I','D') ), -- criar trigger que sempre que um livro é requisitado o valor da disponibilidade é alterado
`Livro` CHAR(13) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_Livro_Livro1`
FOREIGN KEY (`Livro`)
REFERENCES `biblioteca_fc`.`Livro` (`ISBN`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
-- -----------------------------------------------------
-- Table `biblioteca_fc`.`Requisicao`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteca_fc`.`Requisicao` (
`id` INT NOT NULL AUTO_INCREMENT,
`estado` CHAR(1) NOT NULL DEFAULT 'A' CHECK (`estado` IN ('A','C') ), -- 'A' Aberta e 'C' Concluída
`data` DATE NOT NULL,
`Utilizador` INT NOT NULL,
`Funcionario` INT NOT NULL,
`Exemplar` INT NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_Requisicao_Funcionario1`
FOREIGN KEY (`Funcionario`)
REFERENCES `biblioteca_fc`.`Funcionario` (`id`),
CONSTRAINT `fk_Requisicao_Utilizador1`
FOREIGN KEY (`Utilizador`)
REFERENCES `biblioteca_fc`.`Utilizador` (`id`),
CONSTRAINT `fk_Requisicao_Livro1`
FOREIGN KEY (`Exemplar`)
REFERENCES `biblioteca_fc`.`Exemplar` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
-- -----------------------------------------------------
-- Trigger tgINDisponibilidadeLivroRequisicao
-- -----------------------------------------------------
DELIMITER //
CREATE TRIGGER tgINDisponibilidadeLivroRequisicao
AFTER INSERT ON `biblioteca_fc`.`Requisicao`
FOR EACH ROW
BEGIN
UPDATE Exemplar
SET disponibilidade = 'I'
WHERE id = NEW.Exemplar;
END //
-- -----------------------------------------------------
-- Trigger tgALTDisponibilidadeLivroRequisicao
-- -----------------------------------------------------
CREATE TRIGGER tgALTDisponibilidadeLivroRequisicao
AFTER UPDATE ON `biblioteca_fc`.`Requisicao`
FOR EACH ROW
BEGIN
IF NOT (NEW.estado <=> OLD.estado) THEN
UPDATE Exemplar
SET disponibilidade = 'D'
WHERE id = NEW.Exemplar;
END IF;
END //
DELIMITER ;
-- -----------------------------------------------------
-- Table `biblioteca_fc`.`Multa`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteca_fc`.`Multa` (
`id` INT NOT NULL AUTO_INCREMENT,
`estado` CHAR(1) NOT NULL DEFAULT 'N' CHECK (`estado` IN ('N','P') ),
`montante` DECIMAL(8,2) NOT NULL,
`tipo` CHAR(1) NOT NULL DEFAULT 'A' CHECK (`tipo` IN ('A','D')), -- 'A' Atraso, 'D' Dano
`Requisicao` INT NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_Multa_Requisicao1`
FOREIGN KEY (`Requisicao`)
REFERENCES `biblioteca_fc`.`Requisicao` (`id`));
-- -----------------------------------------------------
-- EVENT evMultaAtraso
-- -----------------------------------------------------
DELIMITER //
CREATE EVENT evMultaAtraso
ON SCHEDULE EVERY 1 DAY
STARTS NOW()
ON COMPLETION PRESERVE
DO
BEGIN
INSERT INTO Multa (montante,Requisicao)
SELECT '10',r.id FROM Requisicao r
WHERE r.`data` + INTERVAL 30 DAY <= NOW()
AND r.id NOT IN (SELECT id FROM MULTA m
WHERE m.Requisicao AND m.tipo!='A'); -- Garantir que uma multa de atraso não é cobrada duas vezes
END //
DELIMITER ;
-- -----------------------------------------------------
-- Table `biblioteca_fc`.`Reserva`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteca_fc`.`Reserva` (
`id` INT NOT NULL AUTO_INCREMENT,
`estado` CHAR(1) NOT NULL DEFAULT 'R' CHECK (`estado` IN ('R','C') ),
`data` DATE NOT NULL,
`Utilizador` INT NOT NULL,
`Livro` CHAR(13) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_Reserva_Utilizador1`
FOREIGN KEY (`Utilizador`)
REFERENCES `biblioteca_fc`.`Utilizador` (`id`),
CONSTRAINT `fk_Reserva_Livro_1`
FOREIGN KEY (`Livro`)
REFERENCES `biblioteca_fc`.`Livro` (`ISBN`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;