sql >> Base de Datos >  >> RDS >> Oracle

¿Son aceptables las referencias circulares en la base de datos?

Considera ciudades y estados. Cada ciudad existe dentro de un estado. Cada estado tiene una ciudad capital.

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

Primer problema:no puede crear estas tablas como se muestra, porque una clave externa no puede hacer referencia a una columna en una tabla que (todavía) no existe. La solución es crearlos sin las claves foráneas y luego agregar las claves foráneas.

Segundo problema:no puede insertar filas en ninguna de las tablas, ya que cada inserción requerirá una fila preexistente en la otra tabla. La solución es configurar una de las columnas de clave externa para que sea NULL e insertar esos datos en dos fases. por ejemplo

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