Supongamos que existe una tabla principal que contiene una clave primaria y no hay otra tabla que contiene una clave externa a esta mesa principal. Así que si se elimina la fila de la tabla principal se elimina la mesa de niño también.

¿Cómo puedo escribir esta consulta?

  • ¿qué base de datos está utilizando?
  • base de datos utilizada por mí: sql server 2008
  • quiero una simple Consulta no quiero usar la tienda de procedimiento
  • yo no creo que hay una versión más simple de lo que Lieven ha mencionado a continuación. Solo para aclarar, la CASCADA de la opción ELIMINAR no es una parte de la consulta, es una parte de su Hijo de la tabla de instrucción DDL. Consulte mssqlcity.com/Articles/General/using_constraints.htm para ver un ejemplo
InformationsquelleAutor | 2010-09-07

5 Comentarios

  1. 22

    De tu pregunta, creo que es seguro asumir que usted tiene ELIMINACIONES EN CASCADA encendido.

    Todo lo que se necesita en este caso es de

    DELETE FROM MainTable
    WHERE PrimaryKey = ???

    Que motor de base de datos se encargará de eliminar la correspondiente referencia a los registros.

    • sql Server 2008
    • En oracle, lo primero que necesita para eliminar el dependencies y, a continuación, elimine el padre.
    • Y qué sucederá si la referencia de la tabla es una tabla principal de otra de las mesas y hay una FK con la regla de eliminación: No hay Acción. ¿El servidor permitirá eliminar el registro actual de MainTable donde pongamos Eliminar la regla a: Cascada? Gracias
    • No se, no se. Usted tendrá que quitar el FK restricción o gire el hijo de la tabla eliminaciones en cascada sobre.
  2. 20

    Primero, como una sola vez los datos de restriegan ejercicio, eliminar los huérfanos filas por ejemplo,

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

    Segundo, como un esquema alteración ejercicio, agregar el ON DELETE CASCADE acción referencial para la clave externa de 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, las filas en las tablas de referencia se eliminarán automáticamente cuando su referencia fila se elimina.

  3. 9

    Puede modificar una restricción de clave externa con delete cascade opción como se muestra a continuación. Esto eliminará chind las filas de la tabla relativa a la maestra de las filas de la tabla cuando se elimina.

    ALTER TABLE MasterTable
    ADD CONSTRAINT fk_xyz 
    FOREIGN KEY (xyz) 
    REFERENCES ChildTable (xyz) ON DELETE CASCADE 
    • Esto es genial, sin embargo, no siempre es una solución, cuando se apoya bajo SQLite versiones que puede ser el caso, por ejemplo, en el apoyo de la API de Android 4, que sólo se distribuye con una SQLite justo antes de que la adición de la clave externa de apoyo.
  4. 4

    Si usted tiene que multiplicar las filas a eliminar y usted no desea alterar la estructura de tus tablas
    usted puede utilizar el cursor.
    1-primero debe seleccionar las filas a eliminar(en un cursor)
    2-a Continuación, para cada fila del cursor de eliminar la referencia a filas y después de que eliminar 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

    • Aunque esto funciona, si usted está utilizando T-SQL el rendimiento de los cursores es realmente malo.
  5. -2

    Necesario para establecer la clave externa de la opción como en delete cascade
    en las tablas que contiene las columnas de clave externa…. Es necesario establecer en el momento de la creación de la tabla o añadir más tarde con ALTER table

    • Y por qué publicar algo que ya se ha dado en otras respuestas de nuevo?

Dejar respuesta

Please enter your comment!
Please enter your name here