Tutorial completo de MySQL 8: instalación, administración, tipos de datos y backup (2026)

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP