====== 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. ===== 1. Tipos de datos ===== ^ 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. ===== 2. CREATE TABLE ===== 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''). ===== 3. ALTER y DROP ===== 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 ===== 4. Índices ===== 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. ===== 5. Usuarios y permisos (DCL) ===== 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''. ===== 6. Herramientas ===== 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.