sql >> Databasteknik >  >> RDS >> Oracle

Hur tar man bort rader med dubbelriktade beroenden?

Jag måste undra hur din data hamnade i detta tillstånd från början, eftersom dina främmande nycklar är not null . Om båda tabellerna var tomma till att börja med skulle du aldrig kunna infoga en rad i någon av tabellen.

Jag ignorerar det för ett ögonblick och återskapar ditt scenario, jag har inga problem med att inaktivera begränsningarna:

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.

Jag är inte säker på hur du skulle få en ORA-02297 fel vid försök att inaktivera en främmande nyckel. Det felet ses vanligtvis när du inaktiverar en primär eller unik nyckel som en främmande nyckel förlitar sig på.

Jag misstänker att det du verkligen vill göra är att ställa in begränsningarna på initially deferred . Detta skulle tillåta dig att utföra infogning och borttagning av varje tabell individuellt, så länge som motsvarande rad uppdaterades eller raderades innan transaktionen genomförs:

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. Denormalisering av data (kanske en pivot?)

  2. Standard tabelllåstips på SQL Server 2005/2008

  3. hur man migrerar mysql-data till ElasticSearch i realtid

  4. Långsam underfråga i MySQL