sql >> Database teknologi >  >> RDS >> Oracle

Hvordan sletter man rækker med tovejsafhængigheder?

Jeg må undre mig over, hvordan dine data kom i denne tilstand i første omgang, da dine fremmednøgler er not null . Hvis begge tabeller var tomme til at starte med, ville du aldrig være i stand til at indsætte en række i nogen af ​​tabellerne.

Ved at ignorere det et øjeblik, genskabe dit scenarie, har jeg ingen problemer med at deaktivere begrænsningerne:

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
/

Resultat:

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.

Jeg er ikke sikker på, hvordan du får en ORA-02297 fejl ved forsøg på at deaktivere en fremmednøgle. Denne fejl ses typisk, når en primær eller unik nøgle, som en fremmed nøgle er afhængig af, deaktiveres.

Jeg formoder, at det, du virkelig vil gøre, er at indstille begrænsningerne til initially deferred . Dette vil give dig mulighed for at udføre indsættelser og sletninger af hver tabel individuelt, så længe den tilsvarende række blev opdateret eller slettet, før transaktionen er forpligtet:

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
/

Resultat:

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.


  1. Databasestrukturdesign med variable mængder af felter

  2. Indlejrede kommentarer i PHP og MySQL

  3. Ekskluderer flere værdier fra arrayet

  4. fe_sendauth:ingen adgangskode angivet fejl efter opsætning af PostgreSQL-database på Cloud9 IDE