sql >> Database >  >> RDS >> Oracle

Hoe rijen met bidirectionele afhankelijkheden te verwijderen?

Ik moet me afvragen hoe uw gegevens in deze staat zijn gekomen, aangezien uw externe sleutels not null zijn . Als beide tabellen om te beginnen leeg waren, zou je nooit een rij in een van beide tabellen kunnen invoegen.

Als ik dat even negeer en je scenario opnieuw creëer, heb ik er geen probleem mee om de beperkingen uit te schakelen:

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
/

Resultaat:

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.

Ik weet niet zeker hoe je een ORA-02297 kunt krijgen fout bij een poging om een ​​externe sleutel uit te schakelen. Die fout wordt meestal gezien bij het uitschakelen van een primaire of unieke sleutel waarop een externe sleutel vertrouwt.

Ik vermoed dat je de beperkingen echt wilt instellen op initially deferred . Hierdoor kunt u elke tabel afzonderlijk invoegen en verwijderen, zolang de bijbehorende rij is bijgewerkt of verwijderd voordat de transactie wordt uitgevoerd:

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
/

Resultaat:

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. Probleem met een datumextractie in SQL Server

  2. Kan ik een samengestelde index aanzetten bij gebruik van een left join?

  3. Wat is de beste manier om te controleren of iets bestaat met PDO

  4. Index wordt niet toegepast op geïndexeerde weergave