Oracle
 sql >> Database >  >> RDS >> Oracle

I riferimenti circolari sono accettabili nel database?

Considera città e stati. Ogni città esiste all'interno di uno stato. Ogni stato ha una 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)
);

Primo problema:non è possibile creare queste tabelle come mostrato, perché una chiave esterna non può fare riferimento a una colonna in una tabella che non esiste (ancora). La soluzione è crearli senza le chiavi esterne, quindi aggiungere le chiavi esterne in seguito.

Secondo problema:non è possibile inserire righe in nessuna delle due tabelle, poiché ogni inserimento richiederà una riga preesistente nell'altra tabella. La soluzione consiste nell'impostare una delle colonne della chiave esterna su NULL e inserire i dati in due fasi. es.

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