2010-09-07 206 views
28

Supongamos que hay una tabla principal que contiene una clave principal y otra tabla que contiene una clave externa a esta tabla principal. Entonces, si eliminamos la fila de la tabla principal, también borraremos la tabla hija.Cómo eliminar filas en tablas que contienen claves externas a otras tablas

¿Cómo escribo esta consulta?

+0

@pradeep: ¿qué base de datos está utilizando? –

+1

base de datos utilizada por mí: sql sever 2008 –

+0

quiero consulta simple no quiero utilizar el procedimiento de tienda –

Respuesta

19

De su pregunta, creo que es seguro asumir que tiene CASCADING DELETES encendido.
Todo lo que se necesita en este caso es

DELETE FROM MainTable 
WHERE PrimaryKey = ??? 

motor de base de datos Usted se encargará de borrar los registros que hacen referencia correspondientes.

+0

sql Server 2008 –

+1

En Oracle, primero deberá eliminar las 'dependencias' y luego eliminar el elemento primario. –

+0

Y qué pasará si la tabla referenciada es una tabla principal para otras tablas y hay un FK con la regla Eliminar: ninguna acción. ¿El servidor permitirá eliminar el registro de MainTable actual donde establecemos Delete Rule en: Cascade? Gracias –

7

Puede modificar una restricción de clave externa con la opción de eliminar cascada como se muestra a continuación. Esto eliminará las filas de la tabla dinámica relacionadas con las filas de la tabla maestra cuando se eliminen.

ALTER TABLE MasterTable 
ADD CONSTRAINT fk_xyz 
FOREIGN KEY (xyz) 
REFERENCES ChildTable (xyz) ON DELETE CASCADE 
+0

Sin embargo, esto no es siempre una gran solución cuando se soportan versiones bajas de SQLite, como puede ser el caso de Android 4 que solo se envía con SQLite justo antes de agregar soporte de clave externa. – Daniel

16

En primer lugar, como un ejercicio de técnica de lavado de una sola vez, elimina las filas huérfanos por ejemplo,

DELETE 
    FROM ReferencingTable 
WHERE NOT EXISTS (
        SELECT * 
        FROM MainTable AS T1 
        WHERE T1.pk_col_1 = ReferencingTable.pk_col_1 
       ); 

En segundo lugar, como un ejercicio esquema alteración de una sola vez, añadir el ON DELETE CASCADE acción referencial a la clave externa en la tabla de referencia, por ejemplo,

ALTER TABLE ReferencingTable DROP 
    CONSTRAINT fk__ReferencingTable__MainTable; 

ALTER TABLE ReferencingTable ADD 
    CONSTRAINT fk__ReferencingTable__MainTable 
     FOREIGN KEY (pk_col_1) 
     REFERENCES MainTable (pk_col_1) 
     ON DELETE CASCADE; 

Entonces, para siempre, se eliminarán automáticamente filas en las tablas de referencia cuando se elimina la fila indicada.

4

Si tiene filas se multiplican a borrar y no desea alterar la estructura de las tablas que puede utilizar cursor. 1-Primero debe seleccionar filas para eliminar (en un cursor) 2-Luego, para cada fila en el cursor, elimina las filas de referencia y luego elimina la fila él mismo.

Ex:

--id is primary key of MainTable 
    declare @id int 
    set @id = 1 
    declare theMain cursor for select FK from MainTable where MainID = @id 
    declare @fk_Id int 
    open theMain 
    fetch next from theMain into @fk_Id 
    while @@fetch_status=0 
    begin 
     --fkid is the foreign key 
     --Must delete from Main Table first then child. 
     delete from MainTable where fkid = @fk_Id 
     delete from ReferencingTable where fkid = @fk_Id 
     fetch next from theMain into @fk_Id 
    end 
    close theMain 
    deallocate theMain 

esperanza es útil

+0

Mientras esto funciona, si está usando T-SQL, el rendimiento en los cursores es realmente malo. – Corv1nus

-1

necesidad de establecer la opción de clave externa como en eliminar en cascada ... en las tablas que contienen columnas de clave externa .... Se necesita para establecer en el momento de la creación de la tabla o agregar más tarde utilizando la tabla ALTER

+4

¿Y por qué publicar algo que ya se ha dado en otras respuestas una vez más? –

Cuestiones relacionadas