Categoría: BD
Ejercicio entidad relación
Una empresa vende productos a varios clientes. Se necesita conocer los datos personales de los clientes (nombre, apellidos, dni, dirección y fecha de nacimiento). Cada producto tiene un nombre y un código, así como un precio unitario. Un cliente puede comprar varios productos a la empresa, y un mismo producto puede ser comprado por
varios clientes.
Los productos son suministrados por diferentes proveedores. Se debe tener en cuenta que un producto sólo puede ser suministrado por un proveedor, y que un proveedor puede suministrar diferentes productos. De cada proveedor se desea conocer el NIF, nombre y dirección.
Se desea diseñar la base de datos de un Instituto. En la base de datos se desea guardar
los datos de los profesores del Instituto (DNI, nombre, dirección y teléfono). Los
profesores imparten módulos, y cada módulo tiene un código y un nombre. Cada alumno
está matriculado en uno o varios módulos. De cada alumno se desea guardar el nº de
expediente, nombre, apellidos y fecha de nacimiento. Los profesores pueden impartir
varios módulos, pero un módulo sólo puede ser impartido por un profesor.
Se desea diseñar una base de datos para almacenar y gestionar la información
empleada por una empresa dedicada a la venta de automóviles, teniendo en cuenta los
siguientes aspectos:
La empresa dispone de una serie de coches para su venta. Se necesita conocer la
matrícula, marca y modelo, el color y el precio de venta de cada coche.
Los datos que interesa conocer de cada cliente son el NIF, nombre, dirección, ciudad y
número de teléfono: además, los clientes se diferencian por un código interno de la
empresa que se incrementa automáticamente cuando un cliente se da de alta en ella. Un
cliente puede comprar tantos coches como desee a la empresa. Un coche determinado
solo puede ser comprado por un único cliente.
El concesionario también se encarga de llevar a cabo las revisiones que se realizan a
cada coche. Cada revisión tiene asociado un código que se incrementa automáticamente
por cada revisión que se haga. De cada revisión se desea saber si se ha hecho cambio de
filtro, si se ha hecho cambio de aceite, si se ha hecho cambio de frenos u otros. Los
coches pueden pasar varias revisiones en el concesionario
Base de datos trivial
Mantenimiento categorías
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>Mantenimiento categorías</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<?php
require_once 'libreria.php';
$nombre = filter_input(INPUT_GET, 'nombre', FILTER_SANITIZE_STRING);
$id = filter_input(INPUT_GET, 'idcategoria', FILTER_VALIDATE_INT);
if (!empty($nombre)) {
insertarCategoria($nombre);
}
if (!empty($id)) {
borrarCategoria($id);
}
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
$nombre = filter_input(INPUT_GET, 'categoria', FILTER_SANITIZE_STRING);
if (!empty($id) && !empty($nombre)) {
editarCategoria($id, $nombre);
}
?>
<h1>Mantenimiento categorías</h1>
<form>Nombre: <input type="text" name="nombre"><input type="submit" class="btn btn-success"></form>
<hr/>
<?php
listadoCategorias();
?>
</body>
</html>
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>Editar categoría</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<?php
require_once 'libreria.php';
$id = filter_input(INPUT_GET, 'idcategoria', FILTER_VALIDATE_INT);
if(!empty($id)){
$categoria=getCategoria($id);
}
?>
<form action="categorias.php">
<input type="hidden" name="id" value="<?=$categoria['idcategorias']?>">
Nombre: <input type="text" name="categoria" value="<?=$categoria['nombre']?>">
<input type="submit" class="btn btn-success">
</form>
<a href="categorias.php">Volver a categorías</a>
</body>
</html>
<?php
function conectar() {
$server = "localhost";
$user = "root";
$password = "";
$db = "tienda";
try {
$conn = new PDO("mysql:host=$server;dbname=$db", $user, $password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
function insertarCategoria($name) {
try {
$conn = conectar();
$st = $conn->prepare("insert into categorias (nombre) values (:name)");
$st->execute(['name' => $name]);
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
function borrarCategoria($id) {
try {
$conn = conectar();
$st = $conn->prepare("delete from categorias where idcategorias=:id");
$st->execute(['id' => $id]);
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
function editarCategoria($id,$nombre){
try{
$conn=conectar();
$st=$conn->prepare("update categorias set nombre=:nombre where idcategorias=:id");
$st->execute(['nombre'=>$nombre,'id'=>$id]);
} catch (Exception $ex) {
}
}
function getCategorias() {
try {
$conn = conectar();
$st = $conn->prepare("select * from categorias");
$st->execute();
$categorias = $st->fetchAll();
return $categorias;
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
function getCategoria($id) {
try {
$conn = conectar();
$st = $conn->prepare("select * from categorias where idcategorias=:id");
$st->execute(['id' => $id]);
$categoria = $st->fetch();
return $categoria;
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
function listadoCategorias() {
$categorias = getCategorias();
?>
<table class="table">
<tr><td>Id</td><td>Nombre</td><td>Acciones</td></tr>
<?php
foreach ($categorias as $categoria) {
?>
<tr><td><?= $categoria['idcategorias'] ?></td>
<td><?= $categoria['nombre'] ?></td>
<td>
<a href="?idcategoria=<?= $categoria['idcategorias'] ?>">Borrar</a>
<a href="editar_categoria.php?idcategoria=<?= $categoria['idcategorias'] ?>">Editar</a>
</td>
</tr>
<?php
}
?>
</table>
<?php
}
Categorías Sakila
<h1>Categorías</h1>
<?php
require_once 'libreria.php';
$category = filter_input(INPUT_GET, 'category', FILTER_SANITIZE_STRING);
$category_id = filter_input(INPUT_GET, 'category_id', FILTER_VALIDATE_INT);
if (!empty($category)) {
insertarCategoria($category);
}
if(!empty($category_id)){
borraCategoria($category_id);
}
?>
<form>
Categoría: <input type="text" name="category">
<input type="submit" class="btn btn-success">
</form>
<hr/>
<?php
listadoCategorias();
?>
libreria.php
<?php
function conectar() {
$server = "localhost";
$user = "root";
$password = "";
$db = "sakila";
try {
$conn = new PDO("mysql:host=$server;dbname=$db", $user, $password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
function insertarCategoria($name) {
try {
$conn = conectar();
$st = $conn->prepare("insert into category (name) values (:name)");
$st->execute(['name' => $name]);
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
function borraCategoria($id) {
try {
$conn = conectar();
$st = $conn->prepare("delete from category where category_id=:id");
$st->execute(['id' => $id]);
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
function getCategorias() {
try {
$conn = conectar();
$st = $conn->prepare("select * from category");
$st->execute();
$categorias = $st->fetchAll();
return $categorias;
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
function listadoCategorias() {
echo "hola";
$categorias = getCategorias();
?>
<table class="table">
<tr><td>Id</td><td>Nombre</td><td>Acciones</td></tr>
<?php
foreach ($categorias as $categoria) {
?>
<tr><td><?= $categoria['category_id'] ?></td>
<td><?= $categoria['name'] ?></td>
<td><a href="?category_id=<?= $categoria['category_id'] ?>">Borrar</a></td>
</tr>
<?php
}
?>
</table>
<?php
}
BD tienda
CREATE TABLE `tienda`.`categorias` (
`idcategorias` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(100) NOT NULL,
PRIMARY KEY (`idcategorias`));
CREATE TABLE `tienda`.`productos` (
`idproductos` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(45) NULL,
`precio` DECIMAL(6,4) NULL,
`descripcion` VARCHAR(500) NULL,
`idcategorias` INT NULL,
PRIMARY KEY (`idproductos`),
INDEX `fk_categorias_idx` (`idcategorias` ASC),
CONSTRAINT `fk_categorias`
FOREIGN KEY (`idcategorias`)
REFERENCES `tienda`.`categorias` (`idcategorias`)
ON DELETE RESTRICT
ON UPDATE RESTRICT);
Examen BD
Ejemplo trigger
CREATE TABLE `customer_log` ( `idcustomer_log` int(11) NOT NULL AUTO_INCREMENT, `customer_id` int(11) DEFAULT NULL, `user` varchar(45) DEFAULT NULL, `fecha` datetime DEFAULT NULL, `nombre` varchar(45) DEFAULT NULL, `nombre_ant` varchar(45) DEFAULT NULL, PRIMARY KEY (`idcustomer_log`) ) DELIMITER // CREATE TRIGGER cliente_actualizado BEFORE UPDATE ON customer FOR EACH ROW BEGIN DECLARE vUser varchar(50); -- Find username of person performing the INSERT into table SELECT USER() INTO vUser; -- Insert record into audit table INSERT INTO customer_log ( customer_id, fecha, user,nombre,nombre_ant) VALUES ( NEW.customer_id, SYSDATE(), vUser,NEW.first_name, OLD.first_name ); END;// DELIMITER ;
Ejemplos desencadenadores (triggers)
Al borrar:
CREATE TRIGGER `sakila`.`actor_BEFORE_DELETE` BEFORE DELETE ON `actor` FOR EACH ROW BEGIN if OLD.actor_id between 1 and 20 then SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No puedes borrar'; else insert into actor_log(first_name, last_name) values (OLD.first_name, OLD.last_name); end if; END
Al insertar:
CREATE DEFINER=`root`@`localhost` TRIGGER `sakila`.`payment_BEFORE_INSERT` BEFORE INSERT ON `payment` FOR EACH ROW BEGIN if NEW.amount>=10 then set NEW.amount=9.99; end if; END
Al modificar:
CREATE DEFINER=`root`@`localhost` TRIGGER `sakila`.`payment_BEFORE_UPDATE` BEFORE UPDATE ON `payment` FOR EACH ROW BEGIN if NEW.amount > OLD.amount then set NEW.amount=OLD.amount; end if; END