Hasta ahora trabajamos con tablas ya existentes. En esta guía vamos a entender cómo se diseña una tabla desde cero y qué significa cada parte de su definición.
Diseñar antes de escribir SQL
Antes de crear una tabla conviene pensar qué representa. Una tabla debería tener una responsabilidad clara: alumnos, cursos, productos, ventas, etc.
El diseño comienza identificando:
- la entidad;
- sus atributos;
- qué dato identifica cada fila;
- qué campos son obligatorios;
- qué reglas deben cumplirse;
- con qué otras entidades se relaciona.
¿Qué hace CREATE TABLE?
CREATE TABLE crea una nueva estructura donde luego podremos guardar registros.
CREATE TABLE alumnos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100),
apellido VARCHAR(100),
edad INT,
email VARCHAR(150)
);
Dentro de los paréntesis definimos las columnas, su tipo y las reglas que deben cumplir.
En otras palabras, CREATE TABLE no crea “datos”: crea el molde que determina cómo podrán almacenarse esos datos.
¿Qué es un tipo de dato?
El tipo de dato define qué clase de valor puede guardarse en una columna y cuánto espacio o precisión necesita.
INT
Se usa para números enteros. Es apropiado para edades, cantidades, identificadores o contadores, pero no para teléfonos o documentos si no vamos a hacer operaciones matemáticas con ellos.
edad INT
VARCHAR
Texto de longitud variable. El número entre paréntesis indica la longitud máxima permitida, no la cantidad fija de espacio que necesariamente ocupará cada valor.
nombre VARCHAR(100)
TEXT
Texto largo. Es útil para descripciones extensas, observaciones o contenido donde VARCHAR puede quedarse corto.
descripcion TEXT
DECIMAL
Valores decimales exactos, ideal para dinero.
precio DECIMAL(10,2)
El 10 indica la cantidad total de dígitos y el 2 la cantidad de decimales.
DATE y DATETIME
fecha_nacimiento DATE fecha_creacion DATETIME
BOOLEAN
Representa valores lógicos verdadero/falso. En MySQL suele mapearse internamente a un entero pequeño.
activo BOOLEAN
PRIMARY KEY
Identifica de forma única cada fila.
id INT PRIMARY KEY
Una buena clave primaria debe ser única y estable.
Además, no debería depender de un dato que pueda cambiar frecuentemente. Por eso muchas tablas utilizan un identificador numérico independiente del negocio.
AUTO_INCREMENT
Hace que MySQL genere el siguiente número automáticamente.
id INT AUTO_INCREMENT PRIMARY KEY
NOT NULL
Indica que el campo es obligatorio.
Sin NOT NULL, la columna puede contener NULL, es decir, ausencia de valor. Eso no es lo mismo que una cadena vacía ni que cero.
nombre VARCHAR(100) NOT NULL
UNIQUE
Impide valores duplicados.
Es apropiado para datos que deben ser exclusivos, como un email, número de matrícula o código interno, siempre que las reglas del negocio realmente exijan unicidad.
email VARCHAR(150) UNIQUE
DEFAULT
Define un valor predeterminado cuando no enviamos uno.
activo BOOLEAN DEFAULT TRUE
CHECK
Permite imponer una condición.
Por ejemplo, podemos impedir edades negativas o porcentajes fuera del rango esperado. Esto mueve parte de la validación al propio motor de base de datos.
edad INT CHECK (edad >= 0)
FOREIGN KEY
Una clave foránea conecta una tabla con otra.
FOREIGN KEY (curso_id) REFERENCES cursos(id)
Esto significa que curso_id debe apuntar a un curso válido.
La columna relacionada debería tener un tipo compatible con la clave referenciada. Si cursos.id es INT, normalmente alumnos.curso_id también debe ser INT.
Integridad referencial
Gracias a las claves foráneas, la base puede impedir relaciones inválidas.
Qué ocurre si borramos el registro relacionado
Imaginemos que un alumno apunta al curso 5 y queremos eliminar ese curso. MySQL necesita saber qué hacer con esa relación.
Las opciones típicas son:
RESTRICTo comportamiento equivalente: impedir la eliminación;CASCADE: propagar la eliminación;SET NULL: mantener el registro hijo pero quitar la referencia.
ON DELETE y ON UPDATE
Definen qué ocurre si cambia o se elimina el registro relacionado.
FOREIGN KEY (curso_id) REFERENCES cursos(id) ON DELETE SET NULL ON UPDATE CASCADE
Modificar estructura no es lo mismo que modificar datos
UPDATE cambia valores dentro de filas. ALTER TABLE cambia la estructura de la tabla: columnas, tipos o restricciones.
ALTER TABLE
ALTER TABLE modifica una tabla ya creada.
Agregar una columna
ALTER TABLE alumnos ADD telefono VARCHAR(30);
Modificar una columna
ALTER TABLE alumnos MODIFY telefono VARCHAR(50) NOT NULL;
Renombrar una columna
ALTER TABLE alumnos RENAME COLUMN telefono TO celular;
Eliminar una columna
ALTER TABLE alumnos DROP COLUMN celular;
DROP TABLE
Elimina la tabla completa: estructura y datos.
DROP TABLE alumnos;
TRUNCATE TABLE
Vacía la tabla, pero conserva su estructura.
Es una operación mucho más drástica que un DELETE con WHERE: no sirve para eliminar selectivamente algunas filas.
TRUNCATE TABLE alumnos;
IF NOT EXISTS
Evita error si la tabla ya existe.
CREATE TABLE IF NOT EXISTS cursos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL
);
Cómo diseñar una tabla correctamente
Antes de crearla conviene responder:
- ¿qué entidad representa?
- ¿cuál es su clave primaria?
- ¿qué campos son obligatorios?
- ¿qué datos deben ser únicos?
- ¿con qué otras tablas se relaciona?
Errores comunes
- usar VARCHAR para todo;
- no definir PRIMARY KEY;
- no usar NOT NULL donde corresponde;
- crear relaciones con tipos incompatibles;
- eliminar columnas sin revisar datos.
Ejercicio
Creá tablas categorias y productos con clave primaria, nombre obligatorio, precio, stock, activo y una clave foránea desde productos a categorías.
¿Qué sigue?
INSERT, UPDATE y DELETE para modificar datos.
¿Te sirvió esta guía? ☕
Si este contenido te ayudó y querés apoyar a Club Programador para seguir publicando ejercicios, proyectos y guías gratuitas, podés colaborar mediante:
Ruta SQL / MySQL
Ver todos los contenidos de SQL / MySQL
Descubre más desde Club Programador
Suscríbete y recibe las últimas entradas en tu correo electrónico.
Un comentario en “CREATE TABLE y ALTER TABLE en SQL: tipos de datos, claves y restricciones”