Skip to content

Manual DDL — MySQL / MariaDB ​


1. CREATE DATABASE ​

sql
CREATE DATABASE nombre_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS nombre_db;

2. DROP DATABASE ​

sql
DROP DATABASE nombre_db;
DROP DATABASE IF EXISTS nombre_db;

3. USE ​

sql
USE nombre_db;

4. CREATE TABLE ​

sql
CREATE TABLE nombre_tabla (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(100) NOT NULL,
    precio DECIMAL(10,2) NOT NULL DEFAULT 0,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    categoria_id INT UNSIGNED,
    fecha_creacion DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (categoria_id) REFERENCES categorias(id)
        ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Tipos de datos comunes ​

TipoDescripción
INT / INT UNSIGNEDEntero
BIGINTEntero grande
VARCHAR(n)Cadena variable (n = máx caracteres)
CHAR(n)Cadena fija
TEXTTexto largo
DECIMAL(t,d)Decimal exacto (total, decimales)
FLOAT / DOUBLEDecimal aproximado
DATEFecha (YYYY-MM-DD)
DATETIMEFecha + hora
TIMESTAMPFecha + hora (zona horaria)
BOOLEAN / TINYINT(1)Booleano
ENUM('a','b','c')Valor de una lista
BLOBBinario

Restricciones (constraints) ​

RestricciónDescripción
PRIMARY KEYClave primaria (única + NOT NULL)
UNIQUEValor único
NOT NULLNo permite NULL
DEFAULT valorValor por defecto
AUTO_INCREMENTAuto-incremental (solo enteros)
CHECK(condición)Validación de valores (MySQL ≥ 8.0.16 / MariaDB)
FOREIGN KEYClave foránea

Opciones de tabla ​

sql
ENGINE=InnoDB                    -- Motor (InnoDB recomendado)
DEFAULT CHARSET=utf8mb4          -- Cotejamiento
AUTO_INCREMENT=1000              -- Empezar desde otro número
COMMENT='Descripción de la tabla'

5. ALTER TABLE ​

5.1 Añadir columna ​

sql
ALTER TABLE empleados ADD COLUMN telefono VARCHAR(20);
ALTER TABLE empleados ADD COLUMN telefono VARCHAR(20) AFTER nombre;
ALTER TABLE empleados ADD COLUMN telefono VARCHAR(20) FIRST;

5.2 Eliminar columna ​

sql
ALTER TABLE empleados DROP COLUMN telefono;

5.3 Modificar tipo ​

sql
ALTER TABLE empleados MODIFY COLUMN salario DECIMAL(12,2) NOT NULL;

5.4 Renombrar columna ​

sql
-- MySQL
ALTER TABLE empleados CHANGE salario_antiguo salario DECIMAL(10,2);

-- MySQL 8+ / MariaDB
ALTER TABLE empleados RENAME COLUMN salario_antiguo TO salario;

5.5 Añadir PRIMARY KEY ​

sql
ALTER TABLE empleados ADD PRIMARY KEY (id);
ALTER TABLE empleados DROP PRIMARY KEY, ADD PRIMARY KEY (id);

5.6 Añadir FOREIGN KEY ​

sql
-- Con nombre (recomendado)
ALTER TABLE empleados
ADD CONSTRAINT fk_empleados_depto
FOREIGN KEY (departamento_id) REFERENCES departamentos(id)
ON DELETE RESTRICT ON UPDATE CASCADE;

-- Sin nombre
ALTER TABLE empleados
ADD FOREIGN KEY (departamento_id) REFERENCES departamentos(id);

5.7 Eliminar FOREIGN KEY ​

sql
ALTER TABLE empleados DROP FOREIGN KEY fk_empleados_depto;

5.8 Añadir UNIQUE ​

sql
ALTER TABLE empleados ADD UNIQUE (email);
ALTER TABLE empleados ADD CONSTRAINT uq_empleados_email UNIQUE (email);

5.9 Añadir CHECK ​

sql
ALTER TABLE empleados
ADD CONSTRAINT chk_salario CHECK (salario > 0);

5.10 Añadir / eliminar DEFAULT ​

sql
ALTER TABLE empleados ALTER COLUMN activo SET DEFAULT 1;
ALTER TABLE empleados ALTER COLUMN activo DROP DEFAULT;

5.11 Renombrar tabla ​

sql
ALTER TABLE empleados RENAME TO trabajadores;
-- o
RENAME TABLE empleados TO trabajadores;

6. DROP TABLE ​

sql
DROP TABLE nombre_tabla;
DROP TABLE IF EXISTS nombre_tabla;
DROP TABLE tabla1, tabla2, tabla3;

7. TRUNCATE TABLE ​

sql
TRUNCATE TABLE nombre_tabla;
-- Elimina todos los registros y resetea AUTO_INCREMENT
-- No se puede deshacer (no usa transacción en InnoDB)

8. CREATE INDEX ​

sql
CREATE INDEX idx_empleados_apellido ON empleados(apellido);
CREATE UNIQUE INDEX idx_empleados_email ON empleados(email);
CREATE FULLTEXT INDEX idx_descripcion ON productos(descripcion);

9. DROP INDEX ​

sql
DROP INDEX idx_empleados_apellido ON empleados;

10. ALTER DATABASE ​

sql
ALTER DATABASE nombre_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

11. CREATE VIEW ​

sql
CREATE VIEW empleados_activos AS
SELECT id, nombre, apellido, salario
FROM empleados
WHERE activo = 1;

12. DROP VIEW ​

sql
DROP VIEW IF EXISTS empleados_activos;

Reglas referenciales (ON DELETE / ON UPDATE) ​

AcciónEfecto
RESTRICTBloquea borrar/actualizar si hay dependencias
CASCADEPropaga el borrado/actualización a los hijos
SET NULLPone NULL en los hijos al borrar/actualizar
SET DEFAULTPone el valor por defecto (no soportado en InnoDB)
NO ACTIONIgual que RESTRICT (en MySQL)

Orden lógico de creación ​

  1. CREATE DATABASE
  2. CREATE TABLE (tablas independientes primero, sin FK)
  3. ALTER TABLE ... ADD FOREIGN KEY (tablas dependientes)
  4. ALTER TABLE ... ADD INDEX
  5. CREATE VIEW

Ejemplo completo ​

sql
CREATE DATABASE IF NOT EXISTS tienda CHARACTER SET utf8mb4;
USE tienda;

CREATE TABLE fabricante (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(100) NOT NULL
);

CREATE TABLE producto (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(100) NOT NULL,
    precio DECIMAL(10,2) NOT NULL,
    id_fabricante INT UNSIGNED NOT NULL,
    FOREIGN KEY (id_fabricante) REFERENCES fabricante(id)
        ON DELETE RESTRICT ON UPDATE CASCADE
);

ALTER TABLE producto ADD COLUMN descripcion TEXT AFTER nombre;
ALTER TABLE producto MODIFY COLUMN precio DECIMAL(12,2) NOT NULL;
ALTER TABLE producto ADD INDEX idx_precio (precio);

Publicado bajo la licencia MIT.