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 .