Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Sind Zirkelverweise in der Datenbank akzeptabel?

Betrachten Sie Städte und Staaten. Jede Stadt existiert innerhalb eines Staates. Jeder Staat hat eine Hauptstadt.

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)
);

Erstes Problem - Sie können diese Tabellen nicht wie gezeigt erstellen, da ein Fremdschlüssel nicht auf eine Spalte in einer Tabelle verweisen kann, die (noch) nicht existiert. Die Lösung besteht darin, sie ohne die Fremdschlüssel zu erstellen und die Fremdschlüssel anschließend hinzuzufügen.

Zweites Problem:Sie können in keine der beiden Tabellen Zeilen einfügen, da für jede Einfügung eine bereits vorhandene Zeile in der anderen Tabelle erforderlich ist. Die Lösung besteht darin, eine der Fremdschlüsselspalten auf NULL zu setzen und diese Daten in zwei Phasen einzufügen. z. B.

--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';