Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara menghapus baris dengan dependensi dua arah?

Saya harus bertanya-tanya bagaimana data Anda sampai dalam keadaan ini sejak awal, karena kunci asing Anda not null . Jika kedua tabel kosong untuk memulai, Anda tidak akan pernah bisa menyisipkan baris ke salah satu tabel.

Mengabaikan itu sejenak, membuat ulang skenario Anda, saya tidak punya masalah menonaktifkan kendala:

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
/

Hasil:

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.

Saya tidak yakin bagaimana Anda akan mendapatkan ORA-02297 kesalahan saat mencoba menonaktifkan kunci asing. Kesalahan itu biasanya terlihat saat menonaktifkan kunci utama atau unik yang diandalkan oleh kunci asing.

Saya menduga apa yang benar-benar ingin Anda lakukan adalah mengatur batasan ke initially deferred . Ini akan memungkinkan Anda untuk melakukan penyisipan dan penghapusan ke setiap tabel satu per satu, selama baris yang sesuai telah diperbarui atau dihapus sebelum transaksi dilakukan:

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
/

Hasil:

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. Azure Web App (.NET) terhubung ke Oracle Database tanpa menginstal klien

  2. file atau operasi LOB FILEOPEN gagal saat memuat file XML ke dalam tabel

  3. Oracle :pilih nilai maksimum dari kolom yang berbeda dari baris yang sama

  4. Cara Mengatur Audit Oracle EBS

  5. ResultSet#getDate() semantik