Jeg er ikke helt sikker på, hvad du mener med "forkert id-input", men jeg vil antage, at du mener et id, som ikke er gyldigt, snarere end blot en fejl (som at sige, at nogen er i en anden by, end hvor de virkelig er).
Den fremmede nøgle begrænsning betyder, at den værdi, de indtaster i person
tabel for city_id
har at eksistere som en primær nøgle i city
bord. De kan ikke indsætte nogen gammel værdi som en city_id
, kun gyldige værdier. Og den tilsvarende city
rækken kan derefter ikke slettes uden enten at fjerne/ændre referencen i person
tabel (f.eks. opdatering til en anden gyldig værdi), eller - usandsynligt i dette tilfælde - kaskadering af sletningen, så enhver person
poster for city
slettes.
Så lad os sige, at du opretter dine tabeller som:
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));
Du har tre poster i din city
tabel:
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');
Derefter kan du tilføje en person
der bor i New York ved at inkludere ID for den by:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);
(SQL Fiddle )
Du denormaliserer ikke dataene i den matchende city
rekord, så hvis det New York besluttede at ændre sit navn tilbage til New Amsterdam, for eksempel, ville det være en enkelt opdatering af city
optag, og du behøver ikke røre nogen person
optegnelser for folk i den by.
Hvis du forsøgte at slette city
record for New York, vil du få en fejl (ORA-02292), der siger, at der eksisterede en underordnet post. Du kan opdatere person
record for at have et city_id
af 2 eller 3, og ville derefter være i stand til at slette New York. Tanken er, at du ikke kan gøre dette ved et uheld og efterlade forældreløse data - et person_id
peger på en city
der ikke længere eksisterer.
Hvis du forsøgte at oprette en person
optage med et city_id
værdi, der ikke matcher en city.id
værdi:
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
... så får du en fejl (ORA-02291) om, at den overordnede nøgle - det vil sige et matchende id
værdi i city
tabeller - findes ikke.
Du kan læse mere om fremmednøgler i databasekoncepterne guide .