Vamos a ver los errores más típicos al insertar nuevos datos en una tabla.
Error 1: Intentar insertar NULL en un campo obligatorio
PostgreSQL vigila activamente que se cumplan las reglas de la base de datos. Mira ejemplos de restricciones que pueden causar errores:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL, -- El nombre no puede ser NULL
age INT
);
-- Error: el campo name es obligatorio
INSERT INTO students (name, age) VALUES (NULL, 20);
Resultado: error null value in column "name" of relation "students" violates not-null constraint`.
Tienes que estar atento a los datos que añades. Puede que antes esta columna permitiera NULL, pero ahora es obligatoria.
Error 2: Duplicar datos en una columna única.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
course_name TEXT UNIQUE -- El nombre del curso debe ser único
);
-- La primera inserción funciona
INSERT INTO courses (course_name) VALUES ('SQL Basics');
-- La segunda inserción da error
INSERT INTO courses (course_name) VALUES ('SQL Basics');
Resultado: error duplicate key value violates unique constraint`.
Normalmente no es culpa tuya, el usuario intenta repetir una acción por error. No tienes que hacer nada en esta situación.
Error 3: Violación de integridad referencial.
CREATE TABLE enrollments (
enrollment_id SERIAL PRIMARY KEY,
student_id INT REFERENCES students(id), -- Debe existir un estudiante con ese ID
course_id INT REFERENCES courses(course_id)
);
-- Error: no existe estudiante con ID = 99
INSERT INTO enrollments (student_id, course_id) VALUES (99, 1);
Resultado: error insert or update on table "enrollments" violates foreign key constraint`.
En realidad está bien que salga el error. No hay nada peor que romper la integridad de la base. Seguramente hay un bug en el código que trabaja con la base, o algunos datos están desactualizados. En cualquier caso, si la base de datos no deja romper su integridad — eso es muy bueno.
Manejo de errores en PostgreSQL
Sí, los errores pasan. Pero lo importante no es solo verlos, sino saber cómo manejarlos.
Transacciones como herramienta de protección
Cuando trabajamos con datos usamos mucho las transacciones para asegurar la coherencia. Si hay un error, podemos deshacer los cambios.
Ejemplo: añadir datos en dos tablas.
BEGIN; -- Empezamos la transacción
-- Insertamos datos en la tabla students
INSERT INTO students (name, age) VALUES ('Otto Lin', 21);
-- Insertamos registro en la tabla enrollments
-- Aquí da error si no existe el curso con ID=10
INSERT INTO enrollments (student_id, course_id) VALUES (1, 10);
-- Si todo va bien
COMMIT;
-- Si hay error, deshacemos los cambios
ROLLBACK;
Si el curso con course_id = 10 no existe, la inserción en la tabla students también se deshará.
Manejo de errores en transacciones
En PostgreSQL puedes anticipar errores y manejarlos directamente en las consultas usando bloques EXCEPTION.
Ejemplo: añadimos un estudiante y lo inscribimos en un curso. Si hay error, el registro del error se añade al log.
DO $$
BEGIN
-- Intentamos insertar datos
INSERT INTO students (name, age) VALUES ('Anna Song', 22);
INSERT INTO enrollments (student_id, course_id) VALUES (2, 999); -- Error
-- Si todo va bien
RAISE NOTICE '¡Registro añadido con éxito!';
EXCEPTION
WHEN foreign_key_violation THEN
-- Manejamos la violación de clave foránea
RAISE WARNING 'El curso con el course_id indicado no existe.';
END $$;
Comprobar unicidad con ON CONFLICT
Puedes evitar de antemano el error de violar la restricción UNIQUE usando la construcción ON CONFLICT. Así puedes decidir qué hacer si hay conflicto.
Ejemplo: si intentamos insertar un curso duplicado, saltamos la inserción.
INSERT INTO courses (course_name)
VALUES ('SQL Basics')
ON CONFLICT (course_name) DO NOTHING; -- Saltar datos duplicados
O actualizamos la fila existente:
INSERT INTO courses (course_name)
VALUES ('SQL Basics')
ON CONFLICT (course_name) DO UPDATE
SET course_name = EXCLUDED.course_name || ' (Actualizado)';
Te contaré más sobre el operador ON CONFLICT en el siguiente nivel, cuando veamos carga masiva de datos :P
Errores típicos al trabajar con datos y cómo evitarlos
Ya has visto que las fuentes principales de errores son:
- Violación de restricciones (
NOT NULL,UNIQUE,FOREIGN KEY). - No poner condiciones en las consultas (
WHERE) al actualizar o borrar datos. - Errores en el orden de las transacciones.
Para protegerte:
- Usa transacciones y
ROLLBACKpara operaciones grandes. - Revisa siempre los datos antes de insertar.
- Guarda logs de los errores para analizarlos.
- Aplica
ON CONFLICTpara evitar registros repetidos.
¡Ahora tienes las herramientas para pelearte con los errores! Recuerda: un buen developer no es el que nunca se equivoca, sino el que sabe arreglar sus errores.
GO TO FULL VERSION