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.
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).