Puedes tener un montón de datos, pero no todos son útiles. Para que tu tabla no se convierta en un vertedero, PostgreSQL te deja poner restricciones. Es como poner reglas sencillas para que nadie meta números en el campo "nombre" o lo deje vacío.
¿Qué son los constraints?
Las restricciones (constraints) en PostgreSQL son como reglas de comportamiento en el ejército. Si no existen, cualquiera puede hacer lo que quiera: poner la edad de un usuario como -999, meter una cadena vacía en vez de un nombre o guardar dos veces al mismo estudiante con diferentes id. Para evitar esto, PostgreSQL ofrece mecanismos de control llamados restricciones.
Las restricciones te permiten:
- Hacer que tus datos sigan siendo válidos y coherentes.
- Asegurarte de que los datos cumplen ciertas reglas (por ejemplo, que la edad de una persona no sea negativa).
- Encontrar errores más rápido si los datos no son lo que esperabas.
Hoy vamos a ver las dos restricciones más comunes: NOT NULL y UNIQUE.
Restricción NOT NULL
La restricción NOT NULL le dice a PostgreSQL: "¡Oye, este campo siempre tiene que tener un valor. Aquí no se permite la incertidumbre!". Si intentas meter una fila con NULL en ese campo, PostgreSQL te va a dar un error. Esto es súper útil para los campos obligatorios, como el nombre o la fecha de nacimiento de un estudiante.
Ejemplo de uso de NOT NULL
CREATE TABLE teachers (
id SERIAL PRIMARY KEY, -- Identificador único
name VARCHAR(100) NOT NULL, -- Nombre del profesor (obligatorio)
subject VARCHAR(50) NOT NULL -- Asignatura que imparte (obligatorio)
);
En este ejemplo, las columnas name y subject no pueden quedarse vacías. Si intentas insertar una fila sin valores para estas columnas, te va a saltar un error.
INSERT INTO teachers (name, subject)
VALUES (NULL, 'Matemáticas');
Resultado: ¡error! No pusiste el nombre del profesor y name necesita un valor.
Restricción UNIQUE: se requiere unicidad
La restricción UNIQUE garantiza que los valores en una columna o combinación de columnas no se repitan. Esto es útil si, por ejemplo, necesitas asegurarte de que dos estudiantes no tengan el mismo número de libreta.
Si NOT NULL es como decir "todos los invitados tienen que ir vestidos", UNIQUE sería "nada de vestidos iguales en la fiesta".
Ejemplo de uso de UNIQUE
CREATE TABLE departments (
id SERIAL PRIMARY KEY, -- Identificador único
name VARCHAR(100) UNIQUE -- El nombre del departamento debe ser único
);
Ahora no podrás añadir dos departamentos con el mismo nombre.
INSERT INTO departments (name) VALUES ('Matemáticas');
INSERT INTO departments (name) VALUES ('Matemáticas');
Resultado: ¡error! Intentaste meter una fila con un valor duplicado en la columna name.
Restricción combinada UNIQUE
También puedes pedir unicidad para una combinación de dos (o más) columnas. Por ejemplo:
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY, -- Identificador único para el registro
student_id INTEGER NOT NULL, -- Identificador del estudiante
course_id INTEGER NOT NULL, -- Identificador del curso
UNIQUE (student_id, course_id) -- Un estudiante no puede apuntarse dos veces al mismo curso
);
Ahora cada pareja student_id y course_id tiene que ser única. Si alguien intenta apuntar dos veces al mismo estudiante en el mismo curso, PostgreSQL no lo va a permitir.
Combinando restricciones: NOT NULL y UNIQUE
Puedes combinar NOT NULL y UNIQUE en una sola columna. Por ejemplo:
CREATE TABLE users (
username VARCHAR(50) NOT NULL UNIQUE, -- Login único, obligatorio
email VARCHAR(100) NOT NULL UNIQUE -- Email único, obligatorio
);
Aquí el login y el email tienen que ser únicos y no pueden estar vacíos.
Errores típicos al usar restricciones
Si pones UNIQUE en una columna pero no añades NOT NULL, puedes meter varias filas con valores vacíos NULL, porque PostgreSQL piensa que un NULL no es igual a otro NULL. Si quieres prohibir valores vacíos, pon también NOT NULL.
Intentar meter un valor duplicado en una columna con restricción UNIQUE te va a dar error. Siempre revisa los datos antes de hacer un INSERT.
Poner demasiadas restricciones puede hacer que las operaciones de inserción sean más lentas.
¿Para qué sirve todo esto?
Usar restricciones te ahorra un montón de problemas, como datos duplicados, filas vacías y otros errores que pueden pasar por despistes humanos. Hacen que tu base de datos se "autoproteja", y en proyectos grandes eso te ahorra un tiempo valiosísimo. En las entrevistas suelen preguntar por restricciones, así que saber NOT NULL y UNIQUE no solo es útil, sino que puede impresionar a futuros empleadores.
En la próxima lección veremos la restricción DEFAULT, que te deja poner valores por defecto en las columnas si el usuario no pone nada. ¡Nos vemos!
GO TO FULL VERSION