CodeGym /Cursos /SQL SELF /Manejo de errores al insertar y actualizar datos

Manejo de errores al insertar y actualizar datos

SQL SELF
Nivel 22 , Lección 3
Disponible

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:

  1. Violación de restricciones (NOT NULL, UNIQUE, FOREIGN KEY).
  2. No poner condiciones en las consultas (WHERE) al actualizar o borrar datos.
  3. Errores en el orden de las transacciones.

Para protegerte:

  • Usa transacciones y ROLLBACK para operaciones grandes.
  • Revisa siempre los datos antes de insertar.
  • Guarda logs de los errores para analizarlos.
  • Aplica ON CONFLICT para 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.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION