Curso de MySQL

Crear tablas en MySQL: CREATE TABLE con ejemplos

Por Víctor Peña · Publicado el

Hola, ¿cómo están? Continuando con el curso de MySQL, hoy creamos las tablas de nuestro sistema. Con el diagrama diseñado y los tipos de datos claros, ya tenemos todo lo necesario.

¡Empecemos!

La sentencia CREATE TABLE

USE clinica;

CREATE TABLE especialidades (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL UNIQUE,
    descripcion VARCHAR(255) NULL,
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Repasemos la estructura, porque cada parte tiene su razón:

  • El nombre de la tabla, en minúsculas y plural.
  • Las columnas, cada una con su tipo y sus restricciones.
  • ENGINE=InnoDB, el motor de almacenamiento.
  • El juego de caracteres, que hereda de la base pero conviene declarar.

Convenciones de nombres

No son obligatorias, pero seguir una convención te ahorra dudas constantes:

  • Tablas en plural: pacientes, citas, doctores.
  • Columnas en singular: nombre, fecha, costo.
  • Todo en minúsculas con guiones bajos: fecha_nacimiento, no fechaNacimiento.
  • Claves foráneas con el patrón tabla_id: paciente_id, doctor_id.
  • Siempre id como clave primaria.

Lo importante es elegir una y mantenerla. Una base con Clientes, producto y FechaVenta es un dolor de cabeza permanente.

AUTO_INCREMENT y la clave primaria

id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY

AUTO_INCREMENT hace que MySQL asigne el número solo: 1, 2, 3… Nunca lo escribes al insertar.

Dos detalles que conviene saber:

Los números no se reutilizan. Si borras el registro 5, el siguiente será el 6. Es correcto: reutilizar identificadores causa problemas graves con datos relacionados.

Puede haber huecos. Una inserción fallida consume el número igual. No te preocupes por eso: el id es un identificador, no un contador.

Por qué InnoDB

Como vimos en la lección del modelo relacional, InnoDB es el motor que soporta claves foráneas y transacciones. MyISAM no.

Es el motor por defecto desde hace años, pero declararlo explícitamente no cuesta nada y evita sorpresas si trabajas sobre un servidor con configuración distinta.

Las tablas del sistema

Vamos a crear la estructura completa de la clínica. Fíjate en el orden: primero las tablas que no dependen de nadie.

CREATE TABLE especialidades (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL UNIQUE,
    descripcion VARCHAR(255) NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE pacientes (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    cedula VARCHAR(20) NOT NULL UNIQUE,
    nombre VARCHAR(100) NOT NULL,
    apellido VARCHAR(100) NOT NULL,
    fecha_nacimiento DATE NOT NULL,
    telefono VARCHAR(20) NULL,
    correo VARCHAR(255) NULL,
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE doctores (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    matricula VARCHAR(20) NOT NULL UNIQUE,
    nombre VARCHAR(100) NOT NULL,
    apellido VARCHAR(100) NOT NULL,
    telefono VARCHAR(20) NULL,
    especialidad_id INT UNSIGNED NOT NULL,
    activo BOOLEAN NOT NULL DEFAULT TRUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE citas (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    paciente_id INT UNSIGNED NOT NULL,
    doctor_id INT UNSIGNED NOT NULL,
    fecha DATE NOT NULL,
    hora TIME NOT NULL,
    diagnostico TEXT NULL,
    costo DECIMAL(10,2) NOT NULL DEFAULT 0,
    estado ENUM('programada','atendida','cancelada') NOT NULL DEFAULT 'programada',
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Todavía no declaramos las claves foráneas: eso lo hacemos en la siguiente lección, que trata justamente de las relaciones.

Ver la estructura de una tabla

DESCRIBE pacientes;
SHOW COLUMNS FROM pacientes;
SHOW CREATE TABLE pacientes;

Las tres muestran información distinta. DESCRIBE da un resumen legible; SHOW CREATE TABLE devuelve la sentencia completa con la que se creó, incluidos motor y juego de caracteres. Esta última es la más útil para revisar una base heredada.

Y para listar las tablas:

SHOW TABLES;

Modificar una tabla existente

-- Agregar una columna
ALTER TABLE pacientes ADD COLUMN direccion VARCHAR(255) NULL;

-- Agregarla en una posición concreta
ALTER TABLE pacientes ADD COLUMN ciudad VARCHAR(100) AFTER telefono;

-- Cambiar el tipo
ALTER TABLE pacientes MODIFY COLUMN telefono VARCHAR(30);

-- Renombrar y cambiar tipo a la vez
ALTER TABLE pacientes CHANGE COLUMN correo email VARCHAR(255);

-- Eliminar una columna
ALTER TABLE pacientes DROP COLUMN direccion;

-- Renombrar la tabla
RENAME TABLE pacientes TO clientes;

Una advertencia sobre ALTER TABLE en producción: en tablas grandes puede bloquear la tabla durante minutos, dejando el sistema inaccesible. Prueba siempre en un entorno de desarrollo con un volumen de datos parecido antes de ejecutarlo en el servidor real.

Y sobre DROP COLUMN: elimina los datos de esa columna sin posibilidad de recuperarlos. Respaldo antes.

Eliminar una tabla

DROP TABLE citas;
DROP TABLE IF EXISTS citas;

Sin confirmación y sin vuelta atrás.

Existe también una variante que se confunde con esta:

TRUNCATE TABLE citas;

TRUNCATE vacía la tabla pero la conserva, y además reinicia el contador de AUTO_INCREMENT. Es mucho más rápido que DELETE FROM cuando quieres limpiar todo, pero igual de irreversible.

Copiar una tabla

Útil para hacer pruebas sobre datos reales sin tocar el original:

-- Solo la estructura
CREATE TABLE citas_copia LIKE citas;

-- Estructura y datos
CREATE TABLE citas_respaldo AS SELECT * FROM citas;

Ojo con la segunda: copia los datos pero no copia índices ni claves foráneas. Sirve para respaldos rápidos, no para clonar una tabla de producción.

Crear tablas desde Workbench

En el panel izquierdo, clic derecho sobre Tables → Create Table. Se abre un editor visual donde defines columnas, tipos y restricciones con casillas.

Antes de aplicar, Workbench muestra el SQL que va a ejecutar. Léelo siempre: es la mejor forma de aprender la sintaxis mientras usas la interfaz.

Más adelante verás que el diseñador de diagramas de Workbench puede generar todas estas tablas de una vez a partir del modelo, que es como se trabaja en proyectos reales.

Errores comunes

  • Crear las tablas en el orden equivocado. Si una tabla referencia a otra que aún no existe, la clave foránea falla.
  • Olvidar ENGINE=InnoDB en servidores con MyISAM por defecto, y descubrir después que no admiten relaciones.
  • Mezclar convenciones de nombres.
  • Ejecutar ALTER TABLE en producción sin haberlo probado.
  • Confundir TRUNCATE con DELETE: el primero no se puede revertir dentro de una transacción.
  • No poner NOT NULL en columnas que sí son obligatorias.

Para cerrar

Con CREATE TABLE el diagrama deja de ser un dibujo y se convierte en estructura real. Lo importante: una convención de nombres coherente, InnoDB como motor, y NOT NULL en todo lo que de verdad lo sea.

En la siguiente lección conectamos estas tablas entre sí con claves foráneas.

Saludos y éxitos.

Norvic Software

Desarrollamos el software que tu empresa necesita

Somos una fábrica de software en Bolivia. Construimos sistemas a medida y aplicaciones móviles, y llevamos Inteligencia Artificial a las empresas que ya tienen un sistema funcionando.

Solicitar cotizaciónVer todos los servicios

Cotización sin costo · Respuesta directa por WhatsApp