Oracle
 sql >> Base de données >  >> RDS >> Oracle

Les références circulaires sont-elles acceptables dans la base de données ?

Considérez les villes et les états. Chaque ville existe dans un état. Chaque état a une capitale.

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

Premier problème - Vous ne pouvez pas créer ces tables comme indiqué, car une clé étrangère ne peut pas référencer une colonne dans une table qui n'existe pas (encore). La solution consiste à les créer sans les clés étrangères, puis à ajouter les clés étrangères par la suite.

Deuxième problème - vous ne pouvez pas insérer de lignes dans l'une ou l'autre des tables, car chaque insertion nécessitera une ligne préexistante dans l'autre table. La solution consiste à définir l'une des colonnes de clé étrangère sur NULL et à insérer ces données en deux phases. 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';