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.
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 usarloCONSTRAINT 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 AccessCustomerID 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 relacionalesDROP 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 completaTipos 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 2000INSERT INTO Products
(
ProductID, ProductDescription
)
SELECT 1, 'BigScreen'
UNION ALL
Cómo utilizar subselects en SQL para optimizar tus consultasSELECT 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 softwareSELECT 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 usoSELECT 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