-- 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;