🔹 Introducción
Cuando diseñamos una base de datos no basta con crear tablas y guardar datos.
Necesitamos reglas que aseguren que esos datos sean correctos y coherentes.
👉 Ahí entran las claves y restricciones:
- PRIMARY KEY → identifica de forma única cada fila.
- FOREIGN KEY → conecta tablas entre sí.
- NOT NULL → impide valores vacíos.
- UNIQUE → evita duplicados.
- DEFAULT → define un valor por defecto.
Estas restricciones son como las reglas de tráfico de los datos:
permiten que circulen ordenados y sin choques 🚦.
🔹 Nuestra tabla de ejemplo
Usaremos una base de datos de empleados y departamentos:
CREATE TABLE departamentos (
id INT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL
);
CREATE TABLE empleados (
id INT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
salario DECIMAL(10,2) DEFAULT 1000.00,
departamento_id INT,
FOREIGN KEY (departamento_id) REFERENCES departamentos(id)
);
👉 Observá que:
departamentos.ides PRIMARY KEY.empleados.ides PRIMARY KEY.empleados.nombrees NOT NULL (obligatorio).empleados.emailes UNIQUE (no se repite).empleados.salariotiene un DEFAULT de 1000.empleados.departamento_ides FOREIGN KEY, conecta condepartamentos.
🔹 Ejemplo 1: PRIMARY KEY
Una clave primaria identifica de forma única a cada fila.
CREATE TABLE alumnos (
id INT PRIMARY KEY,
nombre VARCHAR(50)
);
👉 No puede haber dos alumnos con el mismo id.
🔹 Ejemplo 2: NOT NULL
Evita valores vacíos en una columna.
CREATE TABLE productos (
id INT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL
);
👉 Si intentás insertar un producto sin nombre, dará error.
🔹 Ejemplo 3: UNIQUE
Asegura que no existan valores duplicados.
CREATE TABLE clientes (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE
);
👉 Dos clientes no pueden compartir el mismo email.
🔹 Ejemplo 4: DEFAULT
Asigna un valor por defecto si no se especifica.
CREATE TABLE cuentas (
id INT PRIMARY KEY,
saldo DECIMAL(10,2) DEFAULT 0
);
👉 Si no indicás saldo, se guarda automáticamente 0.
🔹 Ejemplo 5: FOREIGN KEY
Crea relaciones entre tablas.
Ejemplo: un empleado pertenece a un departamento.
INSERT INTO departamentos (id, nombre) VALUES (1, 'Recursos Humanos');
INSERT INTO empleados (id, nombre, departamento_id) VALUES (1, 'Laura', 1);
👉 La columna departamento_id debe existir en la tabla departamentos.
Si intentás insertar un departamento que no existe, obtendrás error.
🔹 Ejercicio práctico
- Crea una tabla
categoriasconid(clave primaria) ynombre(NOT NULL). - Crea una tabla
productoscon:id(PRIMARY KEY).nombre(NOT NULL).precio(DEFAULT 10).categoria_id(FOREIGN KEY →categorias.id).
- Inserta un producto sin especificar precio.
- Intenta insertar dos categorías con el mismo
id(¿qué pasa?). - Intenta insertar un producto en una categoría que no existe.
🔹 Soluciones
CREATE TABLE categorias (
id INT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL
);
CREATE TABLE productos (
id INT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
precio DECIMAL(10,2) DEFAULT 10,
categoria_id INT,
FOREIGN KEY (categoria_id) REFERENCES categorias(id)
);
-- Insertar categoría
INSERT INTO categorias (id, nombre) VALUES (1, 'Tecnología');
-- Insertar producto sin precio (se asigna el default)
INSERT INTO productos (id, nombre, categoria_id) VALUES (1, 'Mouse', 1);
-- Intento fallido: dos categorías con el mismo id
INSERT INTO categorias (id, nombre) VALUES (1, 'Ropa'); -- ❌ error
-- Intento fallido: producto en categoría inexistente
INSERT INTO productos (id, nombre, categoria_id) VALUES (2, 'Teclado', 99); -- ❌ error
🔹 Mini Quiz
Resultados
#1. ¿Qué restricción asegura que cada fila de la tabla sea única?
#2. ¿Qué pasa si intento insertar dos filas con el mismo valor en una columna UNIQUE?
#3. ¿Cuál es la función de una FOREIGN KEY?
🔹 Resumen de la lección
Hoy aprendiste que las restricciones en SQL son reglas que garantizan la calidad de los datos:
- PRIMARY KEY → identifica cada fila.
- NOT NULL → evita valores vacíos.
- UNIQUE → impide duplicados.
- DEFAULT → asigna valores automáticos.
- FOREIGN KEY → conecta tablas y asegura integridad.
👉 En la próxima lección veremos cómo usar índices para mejorar el rendimiento de las consultas.
🏆 Este tema es parte de un curso completo. Descubre más lecciones en el Curso SQL.