sql >> Databasteknik >  >> RDS >> Oracle

Är cirkulära referenser godtagbara i databasen?

Tänk på städer och stater. Varje stad finns i en stat. Varje stat har en huvudstad.

CREATE TABLE city (
  city  VARCHAR(32),
  state VARCHAR(32) NOT NULL,
  PRIMARY KEY (city),
  FOREIGN KEY (state) REFERENCES state (state)
);

CREATE TABLE state (
  state VARCHAR(32),
  capital_city VARCHAR(32),
  PRIMARY KEY (state),
  FOREIGN KEY (capital_city) REFERENCES city (city)
);

Första problemet - Du kan inte skapa dessa tabeller som visas, eftersom en främmande nyckel inte kan referera till en kolumn i en tabell som (ännu) inte existerar. Lösningen är att skapa dem utan de främmande nycklarna och sedan lägga till de främmande nycklarna.

Andra problemet - du kan inte infoga rader i någon av tabellen, eftersom varje infogning kräver en redan existerande rad i den andra tabellen. Lösningen är att ställa in en av kolumnerna för främmande nyckel till NULL och infoga den data i två faser. t.ex.

--Create state record
INSERT INTO state (state, capital_city) VALUES ('Florida', NULL);

--Create various city records
INSERT INTO city (city, state) VALUES ('Miami', 'Florida');
INSERT INTO city (city, state) VALUES ('Tallahassee', 'Florida');
INSERT INTO city (city, state) VALUES ('Orlando', 'Florida');

--Set one of the cities as the capital
UPDATE state SET capital_city = 'Tallahassee' WHERE state = 'Florida';


  1. Inaktivera alla tabellbegränsningar i Oracle

  2. Återställ en genomförd transaktion

  3. En guide till partitionering av data i PostgreSQL

  4. Varför min pessimistiska låsning av JPA med Oracle inte fungerar