03 - SQL: DDL

Este tema cubre el DDL (*Data Definition Language*), que define la estructura de la base de datos: crear, modificar y eliminar tablas y sus restricciones. Al final, el DCL (*Data Control Language*): qué usuarios acceden a esa estructura y con qué privilegios.

Tipo Uso
BIGINT, INT Números enteros (identificadores, cantidades)
DECIMAL(10,2) Números exactos con decimales (precios)
VARCHAR(n) Texto de longitud variable limitada
TEXT Texto largo (descripciones)
BOOLEAN TRUE/FALSE
DATE Fecha sin hora
TIMESTAMP Fecha y hora

Para dinero se usa DECIMAL, nunca FLOAT ni DOUBLE: son aproximados.

CREATE TABLE book (
    id             BIGINT AUTO_INCREMENT PRIMARY KEY,
    title          VARCHAR(200) NOT NULL,
    isbn           VARCHAR(13) UNIQUE,
    price          DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    published_date DATE,
    publisher_id   BIGINT,
    FOREIGN KEY (publisher_id) REFERENCES publisher (id)
);

Restricción Función
PRIMARY KEY Identifica cada fila; única y no nula
NOT NULL Columna obligatoria
UNIQUE No admite valores repetidos
DEFAULT Valor cuando no se indica
FOREIGN KEY Referencia a otra tabla; mantiene la integridad referencial
AUTO_INCREMENT Genera el siguiente valor automáticamente

La integridad referencial impide insertar un libro con publisher_id inexistente o borrar una editorial que tenga libros (salvo que se configure ON DELETE CASCADE o SET NULL).

ALTER TABLE book ADD COLUMN synopsis TEXT;
ALTER TABLE book MODIFY COLUMN title VARCHAR(300) NOT NULL;
ALTER TABLE book DROP COLUMN synopsis;

DROP TABLE book;            -- elimina tabla y datos
TRUNCATE TABLE book;        -- vacía los datos, conserva la estructura

Un índice acelera las consultas por una columna concreta, al precio de espacio y escritura algo más lenta:

CREATE INDEX idx_book_title ON book (title);

Las claves primaria y foráneas crean índices automáticamente; los índices extra se añaden cuando las consultas lo piden.

La aplicación no se conecta como administrador: tiene su propio usuario con los privilegios mínimos que necesita:

CREATE USER library_user@'localhost' IDENTIFIED BY 'secret';

GRANT SELECT, INSERT, UPDATE, DELETE ON library.* TO library_user@'localhost';

REVOKE DELETE ON library.* FROM library_user@'localhost';  -- retirar un privilegio

Privilegio Permite
SELECT Consultar
INSERT, UPDATE, DELETE Insertar, modificar y eliminar filas
ALL PRIVILEGES Todo, incluido el DDL: para administración, no para la aplicación

Si la aplicación queda comprometida, el daño queda acotado a lo que ese usuario puede hacer: no puede borrarte la base de datos ni crear cuentas.

La conexión JDBC del tema 05 usa este usuario de aplicación (db.user=library_user), no root.

Las sentencias DDL se ejecutan desde un cliente como DBeaver o la consola de mysql. En un proyecto real, el esquema no se escribe a mano en cada entorno: se versiona con migraciones (tema 07).

Prueba el DDL contra la misma versión de MariaDB que usará la aplicación. Un script que funciona en una herramienta gráfica puede fallar en el servidor real si la sintaxis o el motor difieren.
  • clase/daw/bbdd/1eval/ddl.txt
  • Última modificación: 2026/10/21 10:42
  • por cesguiro