none
Borrar elemento SQL RRS feed

  • Pregunta

  • Buenos dias, necesito saber como puedo borrar un registro de la base de datos con tablas relacionadas. La idea es, en un listbox tengo un campo con los nombres de la Tabla1, selecciono un elemento y ese se debe de borrar, y sus sucesivos registros relacionados en las otras tablas.

    Codigo con el cargo los elementos en el gridview.

    "SELECT * FROM categorias INNER JOIN Subcategorias ON (Subcategorias.categoria = categorias.Id_cat) INNER JOIN productos ON (productos.subcat = Subcategorias.Id_sub)"
    Y este es el codigo que estoy intentando hacer para eliminar, pero no funciona.

    "DELETE FROM categorias INNER JOIN Subcategorias ON (Subcategorias.categoria = categorias.Id_cat) INNER JOIN productos ON (productos.subcat = Subcategorias.Id_sub) WHERE nombre_cat = @1 "
    Cualquier aporte es bien recibido.


    Si la contestación te ha servido de ayuda márcala como respuesta. Si lo que publico no funciona, no tengo la culpa, SOY HUMANO, no una máquina.

    viernes, 16 de septiembre de 2016 10:12

Respuestas

  • LTNs,

    La instrucción DELETE permite eliminar una o mas de filas de una sola tabla, no puedes eliminar filas de varias tablas resultantes de una combinación (JOIN), no es posible ni tampoco permitido.

    Para resolver el caso que presentas tienes dos opciones:

    1. Borrar primero las filas dependientes (que corresponden a la tabla Subcategorias) y luego borrar las filas de la tabla 'Categorias', es decir, realizar dos instrucciones DELETE por separado.
    2. Implementar una regla de eliminación en cascada, de manera que cuando borres una fila de la tabla 'Categorias' se eliminen de manera automática las filas dependientes en la tabla 'SubCategorias'. Pienso que está opción es válida para tu caso dado que las tablas 'Categorias' y 'SubCategorias' tienen una relación de dependencia fuerte.

    Para poner en marcha el punto dos deberás agregar la siguiente restricción a la tabla SubCategorias (en caso ya tengas una restricción FK debes de borrarla o actualizarla desde el diseñador de tablas):

    ALTER TABLE subcategorias ADD CONSTRAINT FK_Categorias FOREIGN KEY (categoria) 
        REFERENCES dbo.categorias (Id_cat)
        ON DELETE CASCADE;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Alberto PoblacionMVP viernes, 16 de septiembre de 2016 19:26
    • Marcado como respuesta LTNs sábado, 17 de septiembre de 2016 9:37
    viernes, 16 de septiembre de 2016 12:56

Todas las respuestas

  • Sería algo como esto

    "DELETE categorias FROM categorias INNER JOIN Subcategorias ON (Subcategorias.categoria = categorias.Id_cat)  INNER JOIN productos ON (productos.subcat = Subcategorias.Id_sub) WHERE nombre_cat = @1 "

    ¿A que tabla pertenece el campo nombre_cat?


    Saludos, Javier J

    viernes, 16 de septiembre de 2016 11:42
  • LTNs,

    La instrucción DELETE permite eliminar una o mas de filas de una sola tabla, no puedes eliminar filas de varias tablas resultantes de una combinación (JOIN), no es posible ni tampoco permitido.

    Para resolver el caso que presentas tienes dos opciones:

    1. Borrar primero las filas dependientes (que corresponden a la tabla Subcategorias) y luego borrar las filas de la tabla 'Categorias', es decir, realizar dos instrucciones DELETE por separado.
    2. Implementar una regla de eliminación en cascada, de manera que cuando borres una fila de la tabla 'Categorias' se eliminen de manera automática las filas dependientes en la tabla 'SubCategorias'. Pienso que está opción es válida para tu caso dado que las tablas 'Categorias' y 'SubCategorias' tienen una relación de dependencia fuerte.

    Para poner en marcha el punto dos deberás agregar la siguiente restricción a la tabla SubCategorias (en caso ya tengas una restricción FK debes de borrarla o actualizarla desde el diseñador de tablas):

    ALTER TABLE subcategorias ADD CONSTRAINT FK_Categorias FOREIGN KEY (categoria) 
        REFERENCES dbo.categorias (Id_cat)
        ON DELETE CASCADE;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Alberto PoblacionMVP viernes, 16 de septiembre de 2016 19:26
    • Marcado como respuesta LTNs sábado, 17 de septiembre de 2016 9:37
    viernes, 16 de septiembre de 2016 12:56