2016-03-22 7 views
0

Ich habe zwei Tabellen NOTIF und PJ_GEN wie folgt definiert:DELETE mit zwei verknüpften Tabelle

TABLE NOTIF 
========== 
ID_NOTIF 
COD_ONE 
LIB 
DATE 

TABLE PJ_GEN 
========== 
ID_PJ 
COD_TWO 
LIB_TWO 

Es gibt eine viele zu viele Verein, der von dieser Tabelle definiert:

PJ_BY_NOTIF 
========== 
ID_NOTIF 
ID_PJ 

Ich möchte schreiben Anforderung, alle Tabellen zu löschen, beginnend mit NOTIF-Tabelle. Meine Basis Anfrage ist:

DELETE * FROM NOTIF WHERE DATE < ? AND COD_ONE = 3; 

Wie ich diese Anfrage zwei beide verknüpften Tabellen PJ_GEN und PJ_BY_NOTIF löschen aktualisieren können?

PJ_BY_NOTF hat zwei Fremdschlüssel: ID_NOTIF und ID_PJ

LÖSUNG:

ich einen Weg finden, indem on delete cascade auf er ID_PJ Fremdschlüssel in PJ_BY_NOTIF

+1

Bitte markieren Sie das RDBMS, das Sie verwenden. –

+0

@ User3469203 Sie haben eine Schleife in Ihrer Lösung in Frage .. wie Sie aus PJ_GEN Tabelle mit diesem Ansatz löschen werden? –

+0

Ich habe zwei Aussagen gemacht: zuerst lösche ich aus PJ_GEN, und lösche diese auch aus PJ_BY_NOTIF (Danke an die ON DELETE CASCADE). Und dann lösche ich von NOTIF. – user3469203

Antwort

0

In diesem Fall hinzufügen, können Sie zuerst löschen von PJ_GEN Tabelle mit Zustand von NOTIF Beitritt PJ_BY-NOTIF Wie

Delete from PJ_GEN where ID_PJ in 
      (select ID_PJ from PJ_BY_NOTIF ,NOTIF 
         where NOTIF.ID_NOTIF = PJ_BY_NOTIF.ID_NOTIF 
         and NOTIF.DATE < ? AND COD_ONE = 3); 

und dann können Sie eine DELETE-Anweisung ausgeben aus PJ_BY_NOTIF Tabelle löschen Viele zu viele Assoziationsbeziehung

DELETE from PJ_BY_NOTIF WHERE ID_PJ IN 
        (SELECT ID_PJ 
         FROM NOTIF 
         WHERE NOTIF.DATE < ? AND COD_ONE = 3); 

zu entfernen: bearbeiten: Wenn Fremdschlüssel in Zwischentabelle ist PJ_BY_NOTIF dann Sie müssen Sie sicherstellen, dass der Fremdschlüssel mit ON DELETE CASCADE Constraint definiert wurde, wenn nicht, dann ändern Sie dies. Wenn ON DELETE CASCADE definiert ist, löscht dies automatisch die entsprechenden untergeordneten Datensätze aus der untergeordneten Tabelle und Sie müssen diese zweite Löschanweisung nicht verwenden.

Bearbeiten 2 - Aber wie dies viele zu viele Beziehung in diesem Szenario beibehalten wird, würde dies die Beziehung mit anderen Wert stören. Es bedeutet, dass, wenn Sie eine ID_PJ mit zwei ID_NOTIF definiert haben aus denen eine NOTIF Sie aus der Master-Tabelle löschen werden und Sie versuchen, von PJ_GEN basierend auf Ihrer Bedingung zu löschen. Da jedoch auch ein anderer ID_NOTIF mit diesem ID_PJ verknüpft ist, sollten Sie diesen bestimmten ID_PJ überspringen, um ihn aus der PJ_GEN-Tabelle zu löschen.

und dann endgültig aus NOTIF Tabelle löschen.

DELETE FROM NOTIF 
WHERE NOTIF.DATE < ? AND COD_ONE = 3 
+0

Die erste Anweisung funktioniert nicht, da es in PJ_GEN einen Fremdschlüssel gibt, der auf den Primärschlüssel NOTIF verweist: 'java.sql.SQLIntegrityConstraintViolationException: ORA-02292: Integritätsbedingung verletzt - untergeordneter Datensatz gefunden – user3469203

+0

Bitte überprüfen Sie, ob Sie einen haben andere Tabelle verweist auf PJ_GEN Tabelle ..weil, wie Sie sagen, Sie haben Fremdschlüssel in PJ_GEN dann sollte es in Ordnung sein Zeilen aus dieser Tabelle zuerst zu löschen .. wie dies als Kind-Tabelle in diesem Fall .. –

+0

eine weitere Sache wird .. bitte überprüfen Sie erneut .. als Sie erwähnen, dass es eine Beziehung von vielen zu vielen hat, es sollte keine Beziehung mit PJ_GEN und NOTIF haben. Diese Beziehung sollte nur von einer Zwischentabelle bewerkstelligt werden, die Sie bereits benutzen 'PJ_BY_NOTIF' –