none
eliminar registros de una tabla y que no afecte a tablas que tienen relacion con la misma

    Question

  • amigos tengo un problema?

    tengo 2  tablas una tabla llamada tbl_servicios, la segunda tbl_cobroServicios,

    entonces mi duda es que al eliminar un registro en tbl_servicios, me manda un error por que

    hay una relacion fk de la tbl_cobroServicios con la tbl_servicios bueno lo que eh visto en este foro

    es que haga un delete en cascada pero al hacer eso se eliminarian los servicios cobrados en la tbl_cobroServicios

    pues esa es mi duda.... como le hago?

     

     

    Wednesday, April 06, 2011 9:49 PM

Answers

  • En lugar de borrar el registro, trata de modificarlo con los datos correctos.

    Las claves foraneas, suelen ir ligadas a las reglas de negocio, y no se han de tocar, ya que para algo se crearon. Intenta no dejar registros sin su relación a la otra tabla, ya que puede romper las reglas de negocio y pudiera provocar errores en tu aplicación según este diseñada.


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    • Marked as answer by orsauhgo Thursday, April 07, 2011 10:56 PM
    Thursday, April 07, 2011 10:15 PM
  • A que te refieres con "no toda la tabla"?

    En mi ejemplo solo elimino un registro. La sentencia DROP TABLE al final del script es para limpiar la db de las tablas ejemplos que he usado.

    De todas maneras, si puedes seguir el consejo de Normannp, pues mejor.

     


    AMB

    Some guidelines for posting questions...

    • Marked as answer by orsauhgo Saturday, April 09, 2011 4:05 AM
    Friday, April 08, 2011 12:24 AM

All replies

  • Habría que ver porque quieres borrar.

    Lo más lógico sería simplemente actualizar en cascada. 

    Podrías eliminar la llave foránea temporalmente y eliminar lo que quieres, pero al recrear la llave una vez borrada, no vas a poder hacerlo ya que tus cobroServicios no se pueden asociar a servicios existentes.

     


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    • Proposed as answer by dani671MVP Wednesday, April 06, 2011 11:19 PM
    Wednesday, April 06, 2011 11:19 PM
  • Si la tabla tbl_cobroServicios hace referencia a la tabla tbl_servicios, entonces si eliminas un servicio padre que tiene hijos que deseas poner en la columna que usas para hacer la referencia?

    Te recomiendo que leas en los libros en linea sobre la clausula ON DELETE. Si la columna que usas para referenciar la tabla tbl_servicios desde tbl_cobroServicios acepta NULL, enotnces puedes usar:

    ON DELETE SET NULL

    Lo que no me gusta de esta opcion es que pierdes el valor al que se apunta, pero pudieras crear una tabla de auditoria para estos casos. Otra cosa que puedes hacer es tener un servicio que se use por defecto para estos casos.

    ON DELETE SET DEFAULT

    Ejemplo:

    USE tempdb;
    GO
    CREATE TABLE T1 (
    c1 int NOT NULL PRIMARY KEY
    );
    GO
    CREATE TABLE T2 (
    c1 int NOT NULL PRIMARY KEY,
    T1_c1 int NULL CONSTRAINT DF_T2_T1_c1 DEFAULT (1),
    CONSTRAINT FK_T2_T1 FOREIGN KEY (T1_c1) REFERENCES T1(c1) ON DELETE SET DEFAULT
    );
    GO
    INSERT INTO T1(c1) VALUES(1);
    INSERT INTO T1(c1) VALUES(2);
    
    INSERT INTO T2(c1, T1_c1) VALUES(1, 2);
    
    SELECT * FROM T1;
    SELECT * FROM T2;
    
    DELETE T1
    WHERE c1 = 2;
    
    SELECT * FROM T1;
    SELECT * FROM T2;
    GO
    ALTER TABLE T2
    DROP CONSTRAINT FK_T2_T1;
    GO
    ALTER TABLE T2
    ADD CONSTRAINT FK_T2_T1 FOREIGN KEY (T1_c1) REFERENCES T1(c1) ON DELETE SET NULL;
    GO
    INSERT INTO T1(c1) VALUES(2);
    
    INSERT INTO T2(c1, T1_c1) VALUES(2, 2);
    
    SELECT * FROM T1;
    SELECT * FROM T2;
    
    DELETE T1
    WHERE c1 = 2;
    
    SELECT * FROM T1;
    SELECT * FROM T2;
    GO
    DROP TABLE T2, T1;
    GO
    

    Cuando haces una pregunta en el foro, y alguna de las respuesta te fue util o sirvio para dar solucion a tu problema, es importante que marques el post como respuesta. De esa forma cuando otro miembro del foro busque por ese tipo de pregunta, pueda ver con claridad el post que sirvio de respuesta.

     


    AMB

    Some guidelines for posting questions...

    Wednesday, April 06, 2011 11:34 PM
  • ok amigo pero lo ke yo nesecito es borrar un registro no toda la tabla...

     

    Thursday, April 07, 2011 9:13 PM
  • En lugar de borrar el registro, trata de modificarlo con los datos correctos.

    Las claves foraneas, suelen ir ligadas a las reglas de negocio, y no se han de tocar, ya que para algo se crearon. Intenta no dejar registros sin su relación a la otra tabla, ya que puede romper las reglas de negocio y pudiera provocar errores en tu aplicación según este diseñada.


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    • Marked as answer by orsauhgo Thursday, April 07, 2011 10:56 PM
    Thursday, April 07, 2011 10:15 PM
  • A que te refieres con "no toda la tabla"?

    En mi ejemplo solo elimino un registro. La sentencia DROP TABLE al final del script es para limpiar la db de las tablas ejemplos que he usado.

    De todas maneras, si puedes seguir el consejo de Normannp, pues mejor.

     


    AMB

    Some guidelines for posting questions...

    • Marked as answer by orsauhgo Saturday, April 09, 2011 4:05 AM
    Friday, April 08, 2011 12:24 AM