Cómo usar las restricciones de integridad referencial en cascada en SQL Server

Las restricciones de integridad referencial en cascada son restricciones de clave externa que le indican a SQL Server que realice ciertas acciones cuando se actualiza o elimina un campo de clave principal en una relación de clave principal-externa. Al usar estas restricciones, puedes definir las acciones que SQL Server 2005 realiza cuando un usuario intenta eliminar o actualizar una clave a la cual apuntan claves externas existentes.

Índice de Contenido
  1. Definición de las restricciones de integridad referencial en cascada
  2. Relaciones y restricciones en cascada
  3. Tipos de restricciones en cascada
    1. SET NULL
    2. CASCADE
    3. SET DEFAULT
    4. NO ACTION
  4. Ejemplo práctico
  5. Usa las restricciones en cascada con precaución

Definición de las restricciones de integridad referencial en cascada

SQL Server te permite definir restricciones de integridad referencial en cascada. Estas acciones tienen un efecto en cascada, a veces afectando varias tablas que están relacionadas con la tabla de clave principal. Veamos cómo se definen estas restricciones y algunas situaciones en las que se pueden utilizar.

EJEMPLO:

IF OBJECT_ID('SalesHistory') > 0

DROP TABLE SalesHistory

CREATE TABLE SalesHistory

Cómo instalar y configurar Sybase Adaptive Server Enterprise (ASE) en Linux

(

SaleID int IDENTITY(1,1) NOT NULL,

ProductID TINYINT,

CustomerID INT,

SaleDate datetime NULL,

SalePrice money NULL,

Qué es sudo y por qué deberías usarlo

CONSTRAINT pk_SaleID PRIMARY KEY (SaleID)

)

IF OBJECT_ID('Customers') > 0

DROP TABLE Customers

CREATE TABLE Customers

(

Cómo eliminar registros duplicados en una base de datos de Access

CustomerID INT,

FirstName VARCHAR(50),

LastName VARCHAR(50),

CONSTRAINT pk_CustomerID PRIMARY KEY (CustomerID)

)

IF OBJECT_ID('Products') > 0

Ventajas de las claves sustitutas en bases de datos relacionales

DROP TABLE Products

CREATE TABLE Products

(

ProductID TINYINT,

ProductDescription VARCHAR(100),

CONSTRAINT pk_ProductID PRIMARY KEY (ProductID)

Tipos de JOIN en SQL: explicación básica y ejemplos

)

Relaciones y restricciones en cascada

Se requieren relaciones entre tablas para realizar actualizaciones o eliminaciones en cascada; estas relaciones se definen a través de restricciones de CLAVE EXTERNA. El siguiente código define una relación entre las tablas SalesHistory y Customers, y una relación entre las tablas SalesHistory y Products.

ALTER TABLE SalesHistory

ADD CONSTRAINT fk_SalesHistoryCustomerID FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE SET NULL ON UPDATE SET NULL

ALTER TABLE SalesHistory

ADD CONSTRAINT fk_SalesHistoryProductID FOREIGN KEY (ProductID) REFERENCES Products(ProductID) ON DELETE CASCADE ON UPDATE CASCADE

Funciones y cláusulas de la instrucción SELECT en SQL: Guía completa

Tipos de restricciones en cascada

A continuación se encuentran los tipos de restricciones en cascada y una descripción de su funcionamiento.

SET NULL

Si una instrucción DELETE afecta filas en una tabla de clave externa, esos valores se establecerán en NULL cuando se elimine el registro de clave principal. Si una instrucción UPDATE afecta filas en la tabla de clave externa, esas filas se actualizarán con el valor NULL después de que se haya actualizado el registro de clave principal. Las columnas de clave externa afectadas deben permitir valores NULL.

CASCADE

Si una instrucción DELETE afecta una o más filas en una tabla de clave externa, esas filas se eliminarán cuando se elimine el registro de clave principal. Si una instrucción UPDATE afecta filas en la tabla de clave externa, esas filas se actualizarán con el valor del registro de clave principal después de que se haya actualizado.

SET DEFAULT

Todos los valores que componen la clave externa en las filas que se hacen referencia se establecen en su valor predeterminado. Todas las columnas de clave externa en la tabla relacionada deben tener restricciones predeterminadas definidas en ellas.

NO ACTION

Esta es la acción predeterminada. Esto indica que si una instrucción UPDATE o DELETE afecta filas en tablas de clave externa, la acción se denegará y se deshará. Se mostrará un mensaje de error.

Ejemplo práctico

Para ver cómo funcionan estas restricciones, agregaré algunos datos a mis tablas.

Cómo utilizar las herramientas de transformación de datos en Microsoft SQL Server 2000Cómo utilizar las herramientas de transformación de datos en Microsoft SQL Server 2000

INSERT INTO Products

(

ProductID, ProductDescription

)

SELECT 1, 'BigScreen'

UNION ALL

Cómo utilizar subselects en SQL para optimizar tus consultas

SELECT 2, 'Computer'

UNION ALL

SELECT 3, 'PoolTable'

INSERT INTO Customers(CustomerID , FirstName , LastName )

SELECT 1, 'Jason', 'Tomes'

UNION ALL

El poder y la importancia del lenguaje SQL en el desarrollo de software

SELECT 2, 'Chris', 'Robards'

UNION ALL

SELECT 3, 'Megan', 'Hill'

UNION ALL

SELECT 4, 'Wanda', 'Guthrie'

UNION ALL

Tipos de datos datetime e intervalo en SQL92: descripción y uso

SELECT 5, 'Lilly', 'Cunningham'

UNION ALL

SELECT 6, 'Amanda', 'Travis'

UNION ALL

SELECT 7, 'Willy', 'Grant'

UNION ALL

SELECT 8, 'Zach', 'Tacoma'

UNION ALL

SELECT 9, 'Marty', 'Smith'

UNION ALL

SELECT 10, 'Wendi', 'Jones'

UNION ALL

SELECT 11, 'Angie' , 'Corolla'

UNION ALL

SELECT 12, 'Shelly', 'Hartson'

A continuación, agregaré datos de muestra a la tabla SalesHistory. Dado que estoy usando un valor numérico para representar a los clientes, puedo generar el número de CustomerID fácilmente usando el operador módulo.

DECLARE @i SMALLINT

SET @i = 1

WHILE (@i <=100)

BEGIN

INSERT INTO SalesHistory(ProductID, SaleDate, SalePrice, CustomerID)

VALUES(1, DATEADD(mm, @i, '3/11/1919'), DATEPART(ms, GETDATE()) + (@i + 57), ((DATEPART(ms, GETDATE()) + (@i + 29)) % 12) + 1)

INSERT INTO SalesHistory(ProductID, SaleDate, SalePrice, CustomerID)

VALUES(2, DATEADD(mm, @i, '3/11/1927'), DATEPART(ms, GETDATE()) + (@i + 13), ((DATEPART(ms, GETDATE()) + (@i + 29)) % 12) + 1)

INSERT INTO SalesHistory(ProductID, SaleDate, SalePrice, CustomerID)

VALUES(3, DATEADD(mm, @i, '3/11/1908'), DATEPART(ms, GETDATE()) + (@i + 29), ((DATEPART(ms, GETDATE()) + (@i + 29)) % 12) + 1)

SET @i = @i + 1

END

Ahora veamos si las restricciones que configuré funcionan. El siguiente script elimina un registro de cliente de mi tabla Customers. Debido a que la restricción en cascada indica ON DELETE SET NULL, los registros asociados en la tabla SalesHistory tendrán el valor NULL en la columna CustomerID donde esa columna tenía el valor 6 antes de la actualización.

DELETE FROM Customers

WHERE CustomerID = 6

Este script invoca la restricción ON DELETE CASCADE definida en la tabla SalesHistory. Esto significa que cuando se elimina un registro de la tabla Products y está relacionado con un registro en la tabla SalesHistory, esos registros de SalesHistory se eliminarán de la tabla.

DELETE FROM Products

WHERE ProductID = 1

Usa las restricciones en cascada con precaución

Puedes usar restricciones en cascada en SQL Server para establecer valores relacionados en NULL, para establecer valores afectados en valores predeterminados originales o para eliminar columnas. Si bien es excelente tener estas capacidades en un entorno de prueba o aseguramiento de la calidad (donde los datos no son datos de producción y se reutilizan constantemente), no recomiendo permitir este tipo de restricciones en un entorno de producción. La razón de esto es que estas restricciones pueden dar lugar a resultados de los cuales tú u otros programadores en tu equipo pueden no estar al tanto, lo que significa que su código no podrá manejar las acciones de la restricción en cascada.

Si te encuentras en una situación en la que necesitas eliminar datos relacionados de diferentes tablas, en mi experiencia es preferible tener procedimientos definidos para hacerlo en lugar de confiar en que la base de datos lo haga automáticamente.

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Gestión de datos, allí encontraras muchos artículos similares a Cómo usar las restricciones de integridad referencial en cascada en SQL Server , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.