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

como inserir chave estrangeira em uma tabela


Não tenho certeza do que você quer dizer com 'introdução de ID incorreta', mas suponho que você queira dizer uma ID que não é válida, em vez de apenas um erro (como dizer que alguém está em uma cidade diferente de onde realmente são).

A restrição de chave estrangeira significa que o valor inserido no person tabela para city_id tem existir como chave primária na city tabela. Eles não podem colocar nenhum valor antigo como um city_id , apenas valores válidos. E a city correspondente a linha não pode ser excluída sem remover/alterar a referência na person tabela (por exemplo, atualizando para um valor válido diferente), ou - improvável neste caso - cascateando a exclusão para que qualquer person registros para a city são deletados.

Então, digamos que você crie suas tabelas como:
create table city (id number primary key, code varchar2(2), name varchar2(30));

create table person (id number, name varchar2(30), last_name varchar2(30),
    city_id number not null references city(id));

Você tem três registros em sua city tabela:
insert into city (id, name) values (1, 'New York');
insert into city (id, name) values (2, 'London');
insert into city (id, name) values (3, 'Paris');

Então você pode adicionar uma person que mora em Nova York, incluindo o ID dessa cidade:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);

(SQL Fiddle )

Você não está desnormalizando os dados na city correspondente registro, então se Nova York decidisse mudar seu nome de volta para Nova Amsterdã, digamos, isso seria uma única atualização para a city gravar e você não teria que tocar em nenhuma person registros de pessoas naquela cidade.

Se você tentou excluir a city registro para Nova York, você obteria um erro (ORA-02292) dizendo que existia um registro filho. Você pode atualizar a person registro para ter um city_id de 2 ou 3, e então poderia deletar Nova York. A ideia é que você não pode fazer isso por acidente e deixar dados órfãos para trás - um person_id apontando para uma city que não existe mais.

Se você tentou criar uma person registro com um city_id valor que não corresponde a um city.id valor:
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);

... então você obteria um erro (ORA-02291) que a chave pai - ou seja, um id correspondente valor na city tabelas - não existe.

Você pode ler mais sobre chaves estrangeiras em os conceitos de banco de dados guia .