Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak usunąć wiersze z zależnościami dwukierunkowymi?

Muszę się najpierw zastanowić, w jaki sposób twoje dane znalazły się w tym stanie, ponieważ twoje klucze obce są not null . Jeśli obie tabele byłyby puste na początku, nigdy nie będziesz w stanie wstawić wiersza do żadnej tabeli.

Ignorując to na chwilę, odtwarzając swój scenariusz, nie mam problemu z wyłączeniem ograniczeń:

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
/

Wynik:

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.

Nie jestem pewien, jak zdobyć ORA-02297 błąd podczas próby wyłączenia klucza obcego. Ten błąd jest zwykle widoczny podczas wyłączania klucza podstawowego lub unikalnego, na którym opiera się klucz obcy.

Podejrzewam, że to, co naprawdę chcesz zrobić, to ustawić ograniczenia na initially deferred . Umożliwiłoby to wstawianie i usuwanie z osobna do każdej tabeli, o ile odpowiedni wiersz został zaktualizowany lub usunięty przed zatwierdzeniem transakcji:

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
/

Wynik:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Równoważna funkcja dla DATEADD() w Oracle

  2. ORA-30076:nieprawidłowe pole ekstraktu dla źródła ekstraktu

  3. Jak wybrać rekordy z maksymalnymi wartościami w dwóch kolumnach?

  4. użycie funkcji rownum z> zaloguj się w oracle

  5. Jak usunąć powtarzające się wiersze w zapytaniu Oracle SQL