none
Eliminar y modificar tablas relacionada SQL RRS feed

  • Pregunta

  • hola que opción es mas conveniente para eliminar o modificar una fila en una tabla con restricciones?
    • [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

    • [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

    y como se puede agregar a una tabla existente...?

    muchas gracias.....

    martes, 8 de diciembre de 2015 17:14

Respuestas

  • Hola Facundo88,

    Si, las reglas por defecto para la actualización y eliminación es NO ACTION, a menos que se haya definido lo contrario al momento de crear la tabla.

    Te comparto un ejemplo que te servirá para hacer lo que requieres. El escenario que presento son dos tablas: cabdocuventa y detdocuventa, ambas tablas se referencia por la columna [idVenta] (PK de cabdocuventa). Se quiere que al eliminar una fila de la tabla cabdocuventa se elimine las filas relacionadas en la tabla detdocuventa.

    USE MiBaseDeDatos;
    
    /*Validar si existe una restricción de tipo Foreign Key para la tabla detdocuventa*/
    /*Si existe obtendremos el nombre, caso contrario null*/
    SELECT
    	b.name
    FROM
    	sys.objects a
    	LEFT JOIN sys.objects b on (b.parent_object_id = a.object_id)
    		AND (b.type = 'F')
    WHERE
    	(a.name = 'detdocuventa');
    
    /*Si existe una restricción FK entonces en base al nombre procedemos a actualizar para eliminar filas en cascada*/
    ALTER TABLE detdocuventa DROP CONSTRAINT FK_DDVe_idVenta;
    ALTER TABLE detdocuventa ADD CONSTRAINT FK_DDVe_idVenta FOREIGN KEY (idVenta) REFERENCES dbo.cabdocuventa (idVenta) ON DELETE CASCADE;
    GO
    
    /*Comprobamos la constraint creada*/
    SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE (CONSTRAINT_NAME = 'FK_DDVe_idVenta');
    GO



    martes, 8 de diciembre de 2015 18:36

Todas las respuestas

  • Hola Facundo88,

    Mencionas restricciones y restricciones no hay sólo una:

    1. Primary Key
    2. Foreign Key
    3. Unique Key
    4. Check Constraint
    5. Not Null

    Intentando adivinar que te refieres a la restricción Foreign Key te comento que la relación se define con NO ACTION tanto para una instrucción DELETE como para UPDATE, ahora, depende de la relación es que a lo máximo podrías tentar a CASCADE pero eso sólo para los casos donde asumas que una fila de la tabla "hija" es dependiente directo de la tabla "padre", por ejemplo las tablas cabecera-detalle, pero si tienes una relación Cliente-Ventas entonces el "borrado en cascada" no debería efectuarse por temas conceptuales y ademas de seguridad.

    Como lo implementas? Si la tabla ya está creada entonces es simple:

    ALTER TABLE MiTabla ALTER CONSTRAINT FK_MiTabla_MiColumna FOREIGN KEY (MiColumna) REFERENCES dbo.MiTablaOrigen (MiColumnaOrigen) ON DELETE CASCADE;

    martes, 8 de diciembre de 2015 17:27
  • Amigo es sentencia me da error.....

    la opción NO ACTION es la que esta por defecto??

    martes, 8 de diciembre de 2015 17:58
  • Hola Facundo88,

    Si, las reglas por defecto para la actualización y eliminación es NO ACTION, a menos que se haya definido lo contrario al momento de crear la tabla.

    Te comparto un ejemplo que te servirá para hacer lo que requieres. El escenario que presento son dos tablas: cabdocuventa y detdocuventa, ambas tablas se referencia por la columna [idVenta] (PK de cabdocuventa). Se quiere que al eliminar una fila de la tabla cabdocuventa se elimine las filas relacionadas en la tabla detdocuventa.

    USE MiBaseDeDatos;
    
    /*Validar si existe una restricción de tipo Foreign Key para la tabla detdocuventa*/
    /*Si existe obtendremos el nombre, caso contrario null*/
    SELECT
    	b.name
    FROM
    	sys.objects a
    	LEFT JOIN sys.objects b on (b.parent_object_id = a.object_id)
    		AND (b.type = 'F')
    WHERE
    	(a.name = 'detdocuventa');
    
    /*Si existe una restricción FK entonces en base al nombre procedemos a actualizar para eliminar filas en cascada*/
    ALTER TABLE detdocuventa DROP CONSTRAINT FK_DDVe_idVenta;
    ALTER TABLE detdocuventa ADD CONSTRAINT FK_DDVe_idVenta FOREIGN KEY (idVenta) REFERENCES dbo.cabdocuventa (idVenta) ON DELETE CASCADE;
    GO
    
    /*Comprobamos la constraint creada*/
    SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE (CONSTRAINT_NAME = 'FK_DDVe_idVenta');
    GO



    martes, 8 de diciembre de 2015 18:36