2011-06-07 18 views
235

Tengo 2 tablas: T1 y T2, son tablas existentes con datos. Tenemos una relación uno a muchos entre T1 y T2. ¿Cómo modifico las definiciones de tabla para realizar la eliminación en cascada en SQL Server cuando se elimina un registro de T1, y todos los registros asociados en T2 también se eliminan?¿Cómo uso la eliminación de cascada con SQL Server?

La restricción foránea está en su lugar. No quiero dejar caer las tablas o crear un desencadenador para hacer la eliminación de T2. Por ejemplo, cuando borro a un empleado, todo el registro de revisión debería desaparecer también.

T1 - Empleado,

Employee ID  
Name 
Status 

T2 - Rendimiento críticas,

Employee ID - 2009 Review 
Employee ID - 2010 Review 

Respuesta

39

usar algo como

ALTER TABLE T2 
ADD CONSTRAINT fk_employee 
FOREIGN KEY (employeeID) 
REFERENCES T1 (employeeID) 
ON DELETE CASCADE; 

Rellena los nombres de las columnas correctas y que debe establecerse. Como mark_s indicó correctamente, si ya tiene una restricción de clave externa en su lugar, tal vez necesite eliminar primero la anterior y luego crear la nueva.

+36

@marc_s - en realidad, puede agregar una segunda clave externa contra exactamente las mismas columnas en ambos lados, y funcionará correctamente. Si trabaja en un entorno de producción sin tiempo de inactividad, puede ser preferible introducir el nuevo FK con cascada, y luego soltar el FK anterior, en lugar de dejar una ventana en la mesa cuando no hay FK en su lugar. (Solo probado en SQL 2008) –

+0

Esto es correcto. Intenté esto, y funciona. No es necesario soltar las primeras restricciones de clave externa. Gracias por la respuesta. –

289

Necesitará,

  • gota el vigente restricción de clave externa,
  • añadir uno nuevo con el ajuste ON DELETE CASCADE habilitado.

Algo así como:

ALTER TABLE dbo.T2 
    DROP CONSTRAINT FK_T1_T2 -- or whatever it's called 

ALTER TABLE dbo.T2 
    ADD CONSTRAINT FK_T1_T2_Cascade 
    FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE 
+3

Otro punto a favor de las eliminaciones duras sobre las eliminaciones suaves – jbd

12

primera en permitir la propiedad ONCascade:

1.Drop el vigente restricción de clave externa

2.Add una nueva con el ON DELETE Configuración CASCADE habilitada

Ej:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response')) 
BEGIN 

ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request] 

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId]) 
REFERENCES [dbo].[Request] ([RequestId]) 
ON DELETE CASCADE 
END 

ELSE 

BEGIN 
ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId]) 
REFERENCES [dbo].[Request] ([RequestId]) 
ON DELETE CASCADE 
END 

segundo para inhabilitar ONCascade propiedad:

1.Drop el vigente restricción de clave externa

2.Add una nueva con el ON DELETE NO entorno ACCIÓN habilitado

Ex:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response')) 
BEGIN 
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request] 

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId]) 
REFERENCES [dbo].[Request] ([RequestId]) 
ON DELETE CASCADE 
END 

ELSE 

BEGIN 
ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId]) 
REFERENCES [dbo].[Request] ([RequestId]) 
ON DELETE NO ACTION 
END 
133

Puede hacer esto con SQL Server Management St udio.

→ Haga clic derecho en el diseño de la mesa e ir a Relaciones y elegir la clave externa en el panel del lado izquierdo y en el panel derecho, expanda la "especificación de inserción y actualización" y seleccione "cascada" como regla de supresión .

SQL Server Management Studio

+0

hola, ¿cuál es la diferencia entre las 4, no se convierte en cascada en que sea fácil de eliminar todos los datos en una tabla. ¿Cómo puedo ver todas las dependencias/claves fk * en * esta tabla, no desde esta tabla. Incluso después de eliminar todos los FK todavía recibo un error – aggie

+0

@aggie - Puede verificar las dependencias haciendo clic con el botón derecho en la tabla -> "Ver dependencias" También el servidor sql le dará el error detallado con nombre de tabla y columna como este "La instrucción DELETE entró en conflicto con la restricción de REFERENCIA" FK_Child1_Parent1 ". El conflicto se produjo en la base de datos" TESTDB ", tabla" dbo ".Child1 ", columna 'Parent1ID'." –

+0

@aggie: también el 4 ° caso "Establecer valor predeterminado" es: debe establecer la restricción predeterminada en la columna Clave externa, cuando eliminamos el elemento primario, el valor predeterminado se reemplazará en tablas secundarias. (Nota: El valor predeterminado debe coincidir con la tabla principal.) Para obtener más información, visite https://www.mssqltips.com/sqlservertip/2365/sql-server-foreign-key-update-and-delete-rules/ –

177

Para agregar "Eliminar en cascada" a una clave externa existente en SQL Server Management Studio:

En primer lugar, seleccione su clave externa, y abrirlo es "soltar y crear para .." en una nueva ventana de consulta.

enter image description here

A continuación, sólo tiene que añadir ON DELETE CASCADE al comando ADD CONSTRAINT:

n y pulsa el botón "Ejecutar" para ejecutar esta consulta.

Por cierto, para obtener una lista de las claves externas, y ver cuáles han "Eliminar en cascada" encendido, puede ejecutar este script:

SELECT 
    OBJECT_NAME(f.parent_object_id) AS 'Table name', 
    COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Field name', 
    delete_referential_action_desc AS 'On Delete' 
FROM sys.foreign_keys AS f, 
    sys.foreign_key_columns AS fc, 
    sys.tables t 
WHERE f.OBJECT_ID = fc.constraint_object_id 
AND t.OBJECT_ID = fc.referenced_object_id 
ORDER BY 1 

Y si alguna vez se encuentra que pueda 't DROP una tabla en particular debido a una restricción de clave externa, pero no se puede averiguar qué FK está causando el problema, a continuación, se puede utilizar el SQL que he proporcionado aquí:

How can I list all foreign keys referencing a given table in SQL Server?

el SQL en ese artículo enumera todos los FK que hacen referencia una mesa particular

Espero que todo esto ayude.

Particularmente el dedo largo.

+16

[Sr. Fantástico] (https://en.wikipedia.org/wiki/Mister_Fantastic) sustos de los dedos. – ruffin

+27

jajaja en el dedo: D – Cloud

+6

Mi corazón se hundió con miedo cuando vi ese dedo – BDillan

-5

Creo que no se puede simplemente eliminar la propiedad de las tablas, si estos son los datos de producción reales, simplemente elimine los contenidos que no afectan el esquema de la tabla.

5

ON DELETE CASCADE
Especifica que los datos secundarios se eliminan cuando se eliminan los datos principales.

CREATE TABLE products 
(product_id INT PRIMARY KEY, 
    product_name VARCHAR(50) NOT NULL, 
    category VARCHAR(25) 
); 

CREATE TABLE inventory 
(inventory_id INT PRIMARY KEY, 
    product_id INT NOT NULL, 
    quantity INT, 
    min_level INT, 
    max_level INT, 
    CONSTRAINT fk_inv_product_id 
    FOREIGN KEY (product_id) 
    REFERENCES products (product_id) 
    ON DELETE CASCADE 
); 

Por esta clave externa, hemos especificado la cláusula ON DELETE CASCADE que le dice a SQL Server para eliminar los registros correspondientes en la tabla secundaria cuando se borran los datos de la tabla primaria. Por lo tanto, en este ejemplo, si se elimina un valor de product_id de la tabla de productos, también se eliminarán los registros correspondientes en la tabla de inventario que usan este product_id.

Cuestiones relacionadas