Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie lösche ich Zeilen mit bidirektionalen Abhängigkeiten?

Ich muss mich fragen, wie Ihre Daten überhaupt in diesen Zustand geraten sind, da Ihre Fremdschlüssel not null sind . Wenn beide Tabellen von Anfang an leer wären, könnten Sie niemals eine Zeile in eine der Tabellen einfügen.

Wenn ich das für einen Moment ignoriere und Ihr Szenario neu erstelle, habe ich kein Problem damit, die Einschränkungen zu deaktivieren:

CREATE TABLE tablea(id NUMBER(19, 0) NOT NULL, 
                    rtablea_id NUMBER(19, 0) NOT NULL, 
                    PRIMARY KEY(id))
/

CREATE TABLE tableb(id NUMBER(19, 0) NOT NULL, 
                    rtableb_id NUMBER(19, 0) NOT NULL, 
                    PRIMARY KEY(id))
/

INSERT INTO tablea
VALUES     (1, 2)
/

INSERT INTO tableb
VALUES     (2, 1)
/

ALTER TABLE tablea ADD CONSTRAINT fka1 
                       FOREIGN KEY (rtablea_id)  
                       REFERENCES tableb
/
ALTER TABLE tableb ADD CONSTRAINT fkb1  
                       FOREIGN KEY (rtableb_id)  
                       REFERENCES tablea
/
ALTER TABLE tablea MODIFY CONSTRAINT fka1 DISABLE
/
ALTER TABLE tableb MODIFY CONSTRAINT fkb1 DISABLE
/
delete tablea
/
delete tableb
/
commit
/

Ergebnis:

Table created.
Table created.
1 row created.
1 row created.
Table altered.
Table altered.
Table altered.
Table altered.
1 row deleted.
1 row deleted.
Commit complete.

Ich bin mir nicht sicher, wie Sie einen ORA-02297 bekommen würden Fehler beim Versuch, einen Fremdschlüssel zu deaktivieren. Dieser Fehler tritt normalerweise auf, wenn ein Primärschlüssel oder eindeutiger Schlüssel deaktiviert wird, auf dem ein Fremdschlüssel basiert.

Ich vermute, was Sie wirklich tun möchten, ist, die Einschränkungen auf initially deferred zu setzen . Dies würde es Ihnen ermöglichen, Einfügungen und Löschungen für jede Tabelle einzeln durchzuführen, solange die entsprechende Zeile aktualisiert oder gelöscht wurde, bevor die Transaktion festgeschrieben wurde:

CREATE TABLE tablea(id NUMBER(19, 0) NOT NULL,  
                    rtablea_id NUMBER(19, 0) NOT NULL,  
                    PRIMARY KEY(id))
/

CREATE TABLE tableb(id NUMBER(19, 0) NOT NULL,  
                    rtableb_id NUMBER(19, 0) NOT NULL,  
                    PRIMARY KEY(id))
/

ALTER TABLE tablea ADD CONSTRAINT fka1 
                       FOREIGN KEY (rtablea_id) 
                       REFERENCES tableb 
                       INITIALLY DEFERRED
/
ALTER TABLE tableb ADD CONSTRAINT fkb1 
                       FOREIGN KEY (rtableb_id) 
                       REFERENCES tablea 
                       INITIALLY DEFERRED
/

INSERT INTO tablea
VALUES     (1, 2)
/

INSERT INTO tableb
VALUES     (2, 1)
/

INSERT INTO tableb
VALUES     (3, 1)
/

COMMIT
/

DELETE tableb
WHERE  id = 2
/

UPDATE tablea
SET    rtablea_id   = 3
WHERE  id = 1
/

COMMIT
/

Ergebnis:

Table created.
Table created.
Table altered.
Table altered.
1 row created.
1 row created.
1 row created.
Commit complete.
1 row deleted.
1 row updated.
Commit complete.