Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

As referências circulares são aceitáveis ​​no banco de dados?


Considere cidades e estados. Cada cidade existe dentro de um estado. Cada estado tem uma 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)
);

Primeiro problema - Você não pode criar essas tabelas como mostrado, porque uma chave estrangeira não pode referenciar uma coluna em uma tabela que (ainda) não existe. A solução é criá-los sem as chaves estrangeiras e adicionar as chaves estrangeiras posteriormente.

Segundo problema - você não pode inserir linhas em nenhuma tabela, pois cada inserção exigirá uma linha pré-existente na outra tabela. A solução é definir uma das colunas de chave estrangeira como NULL e inserir esses dados em duas fases. por exemplo.
--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';