La tabla es la unidad fundamental de almacenamiento en MySQL. Al crearla defines el nombre, las columnas (con su tipo y restricciones) y las claves. Elegir el tipo de dato correcto para cada columna afecta al espacio en disco, la velocidad de las consultas y la integridad de los datos.
En este capítulo cubrimos los tipos de datos más usados, las restricciones (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, DEFAULT, CHECK) y las opciones de la instrucción CREATE TABLE.
Tipos de datos numéricos
|
Tipo | Bytes | Rango (signed) | Uso típico |
TINYINT | 1 | -128 a 127 | Flags booleanos (0/1), estados |
SMALLINT | 2 | -32768 a 32767 | Códigos cortos, años |
INT | 4 | -2.1B a 2.1B | IDs, contadores generales |
BIGINT | 8 | ±9.2 × 10¹⁸ | IDs de alto volumen, timestamps Unix |
DECIMAL(p,d) | variable | exacto | Dinero, precios (NUNCA FLOAT para dinero) |
FLOAT / DOUBLE | 4 / 8 | aproximado | Coordenadas, métricas científicas |
Tipos de texto
Tipo | Tamaño máximo | Uso típico |
CHAR(n) | n caracteres (fijo) | Códigos de longitud fija (ISBN, código postal) |
VARCHAR(n) | n caracteres (variable) | Nombres, emails, URLs cortas |
TEXT | ~65 KB | Artículos, comentarios, descripciones largas |
MEDIUMTEXT | ~16 MB | Cuerpo de artículos muy largos, HTML |
LONGTEXT | ~4 GB | Logs, documentos enormes |
Tipos de fecha y hora
Tipo | Rango | Notas |
DATE | 1000-01-01 a 9999-12-31 | Solo fecha, sin hora |
TIME | -838:59:59 a 838:59:59 | Solo hora (también para duraciones) |
DATETIME | 1000-01-01 a 9999-12-31 | Fecha + hora sin zona horaria |
TIMESTAMP | 1970-01-01 a 2038-01-19 | Se guarda en UTC, se convierte a la zona local |
YEAR | 1901 a 2155 | Solo el año (1 byte) |
Otros tipos
-- BOOLEAN / BOOL: alias de TINYINT(1); 0=FALSE, 1=TRUE
activo BOOLEAN NOT NULL DEFAULT TRUE,
-- ENUM: conjunto finito de valores (se almacena como número entero internamente)
estado ENUM('pendiente','pagado','enviado','cancelado') NOT NULL DEFAULT 'pendiente',
-- SET: conjunto de valores (puede tener múltiples a la vez)
permisos SET('leer','escribir','borrar','admin'),
-- JSON (MySQL 5.7+): almacena JSON validado y consultable con funciones JSON
configuracion JSON,
-- BLOB (binary large object): para datos binarios
foto MEDIUMBLOB
CREATE TABLE con todas las restricciones
CREATE TABLE clientes (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL,
ciudad VARCHAR(80) NULL,
fecha_alta DATE NOT NULL DEFAULT (CURRENT_DATE),
activo BOOLEAN NOT NULL DEFAULT TRUE,
notas TEXT,
-- Restricciones
PRIMARY KEY (id),
UNIQUE KEY uk_email (email),
INDEX idx_ciudad (ciudad),
INDEX idx_fecha (fecha_alta)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci
COMMENT='Tabla de clientes registrados';
Claves foráneas (FOREIGN KEY)
CREATE TABLE pedidos (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_cliente INT UNSIGNED NOT NULL,
fecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
total DECIMAL(10,2),
PRIMARY KEY (id),
INDEX idx_cliente (id_cliente),
CONSTRAINT fk_pedidos_cliente
FOREIGN KEY (id_cliente)
REFERENCES clientes (id)
ON DELETE RESTRICT -- no permite borrar un cliente con pedidos
ON UPDATE CASCADE -- si cambia el id del cliente, se actualiza aquí
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Las claves foráneas con ON DELETE RESTRICT impiden borrar un padre mientras tenga hijos. ON DELETE CASCADE borra los hijos automáticamente. ON DELETE SET NULL pone la FK a NULL. Para que las FKs funcionen, ambas tablas deben usar InnoDB y la columna referenciada debe ser la PRIMARY KEY o tener un UNIQUE index.
