Nie jestem do końca pewien, co rozumiesz przez „nieprawidłowy identyfikator”, ale zakładam, że masz na myśli nieprawidłowy identyfikator, a nie tylko pomyłkę (jak powiedzenie, że ktoś jest w innym mieście niż to, w którym naprawdę są).
Ograniczenie klucza obcego oznacza, że wartość, którą wprowadzają w person
tabela dla city_id
ma istnieć jako klucz podstawowy w city
stół. Nie mogą umieścić żadnej starej wartości jako city_id
, tylko prawidłowe wartości. I odpowiadające mu city
wiersz nie może zostać usunięty bez usunięcia/zmiany odniesienia w person
tabela (np. aktualizacja do innej prawidłowej wartości) lub - w tym przypadku mało prawdopodobne - kaskadowe usuwanie, tak aby każda person
rekordy dla city
zostaną usunięte.
Powiedzmy, że tworzysz swoje tabele jako:
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));
Masz trzy rekordy w swoim 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');
Następnie możesz dodać person
mieszka w Nowym Jorku, podając identyfikator tego miasta:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);
(Skrzypce SQL )
Nie denormalizujesz danych w pasującym city
rekord, więc gdyby Nowy Jork zdecydował się zmienić nazwę z powrotem na Nowy Amsterdam, powiedzmy, byłaby to pojedyncza aktualizacja city
nagrywaj i nie musisz dotykać żadnej person
rekordy dla osób w tym mieście.
Jeśli próbowałeś usunąć city
rekord dla Nowego Jorku, otrzymasz błąd (ORA-02292) mówiący, że istnieje rekord podrzędny. Możesz zaktualizować person
rekord, aby mieć city_id
2 lub 3, a następnie będzie w stanie usunąć Nowy Jork. Chodzi o to, że nie możesz tego zrobić przez przypadek i zostawić osierocone dane - person_id
wskazując na city
które już nie istnieje.
Jeśli próbowałeś utworzyć person
rekord z city_id
wartość, która nie pasuje do city.id
wartość:
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
... wtedy otrzymasz błąd (ORA-02291), że klucz nadrzędny - czyli pasujący id
wartość w city
tabele - nie istnieje.
Więcej informacji o kluczach obcych można znaleźć w pojęciach dotyczących baz danych przewodnik .