sql >> Databáze >  >> RDS >> Oracle

Jak odstranit řádky s obousměrnými závislostmi?

Zajímalo by mě, jak se vaše data dostala do tohoto stavu, protože vaše cizí klíče not null . Pokud by byly obě tabulky na začátku prázdné, nikdy byste nebyli schopni vložit řádek do žádné tabulky.

Když to na chvíli ignoruji a znovu vytvořím váš scénář, nemám problém deaktivovat omezení:

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
/

Výsledek:

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.

Nejsem si jistý, jak byste získali ORA-02297 chyba při pokusu o deaktivaci cizího klíče. Tato chyba se obvykle vyskytuje při deaktivaci primárního nebo jedinečného klíče, na který cizí klíč spoléhá.

Mám podezření, že to, co opravdu chcete udělat, je nastavit omezení na initially deferred . To by vám umožnilo provádět vkládání a odstraňování do každé tabulky jednotlivě, pokud byl odpovídající řádek aktualizován nebo odstraněn před provedením transakce:

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
/

Výsledek:

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. MySQL:Vložte více řádků se stejnou hodnotou AI

  2. Jak vytvořit složku zip v plsql (Oracle)

  3. Jak převedu řádky na sloupce na serveru SQL Server 2005

  4. 5 způsobů aktualizace dat pomocí dílčího dotazu v Oracle SQL