Conflicto DELETE Statement con referencia a Foreign Key

publicado por: Anonymous

Uso SQL Server 2017 con Management Studio y Java 8.

Tengo una base de datos sobre películas y recibo error al intentar borrar una película que está haciendo referencia a otra tabla que actúa como intermedia.

Diagrama (valores de ejemplo en color rojo):
introducir la descripción de la imagen aquí

Error:

SQLServerException: The DELETE statement conflicted with the REFERENCE
constraint “FK_PELICULAS_GENEROS_PELICULAS”. The conflicted occurred
in database “industriaCine”, table “dbo.PELICULAS_GENEROS”, column
“id_pelicula”.

Código para eliminar:

public boolean eliminarPelicula(int id) {
        sSQL =  "DELETE FROM peliculas WHERE id_pelicula=?";

        boolean resultado;

        // Java 7 try-with-resources
        try (PreparedStatement pstm = con.prepareStatement(sSQL)) {

            pstm.setInt(1, id);
            pstm.executeUpdate();

            resultado = true;

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "SQLException:n" + e, "Error: eliminarPelicula()", JOptionPane.ERROR_MESSAGE);
            resultado = false;
            }

        return resultado;
    }

La Foreign Key la hice de esta manera:

ALTER TABLE PELICULAS_GENEROS ADD CONSTRAINT FK_PELICULAS_GENEROS_PELICULAS FOREIGN KEY (id_pelicula) REFERENCES PELICULAS(id_pelicula);

La idea es que si borro un id_pelicula, también se borre id_pelicula de la tabla PELICULAS_GENEROS. Ejemplo (como en la foto de arriba), si borro la película con id_pelicula = 2, el error aparece.

Primera vez que hago algo como esto.

Qué está pasando?, por qué el error?. Debo cambiar algo en SQL Management Studio en las referencias?.

Estoy perdido, gracias de antemano por la ayuda.

solución

El error ocurre porque hay una referencia a un registro (en este caso, la película de id 2) en otra tabla, y quieres eliminar ese registro.
Por defecto, la base de datos no te dejará eliminarlo. Sin embargo, al crear la relacion, puedes especificarle mediante la query de ejecución que deseas que la base “elimine en cascada” al momento de eliminar un registro.
Lo mismo ocurre cuando deseas actualizar un registro.

ALTER TABLE peliculas_generos
drop CONSTRAINT [NOMBRE_CONSTRAINT de ID_PELICULA];

ALTER TABLE peliculas_generos
ADD CONSTRAINT [NOMBRE_CONSTRAINT de ID_PELICULA]
    FOREIGN KEY (id_pelicula)
    REFERENCES pelicua
        (id_pelicula)
    ON DELETE CASCADE;

Aclaracion: Lo que está entre [ ] (con [ ] inclusive) es información a reemplazar.

De todas formas, tu tienes control en java y puedes realizar fácilmente la eliminación en cascada de manera manual, es decir, primero eliminas de la tabla pelicula_genero cuando el id_pelicula sea = 2 y luego eliminas en la tabla pelicula. A veces con la simple creación de un método más puedes evitar errores a futuro.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *