Jag är inte helt säker på vad du menar med "fel ID-inmatning", men jag antar att du menar ett ID som inte är giltigt, snarare än bara ett misstag (som att säga att någon är i en annan stad än där de verkligen är).
Den främmande nyckel-begränsningen betyder att värdet de anger i person
tabell för city_id
har att finnas som en primärnyckel i city
tabell. De kan inte lägga in något gammalt värde som ett city_id
, endast giltiga värden. Och motsvarande city
rad kan då inte tas bort utan att antingen ta bort/ändra referensen i person
tabell (t.ex. uppdatering till ett annat giltigt värde), eller - osannolikt i det här fallet - kaskad raderingen så att någon person
poster för city
är raderade.
Så låt oss säga att du skapar dina 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
tabell:
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');
Sedan kan du lägga till en person
som bor i New York genom att inkludera ID för den staden:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);
(SQL Fiddle )
Du avnormaliserar inte data i den matchande city
rekord, så om det New York beslutade att ändra sitt namn tillbaka till New Amsterdam, säg, skulle det vara en enda uppdatering av city
spela in och du skulle inte behöva röra någon person
rekord för människor i den staden.
Om du försökte ta bort city
rekord för New York, skulle du få ett felmeddelande (ORA-02292) som säger att det fanns en underordnad post. Du kan uppdatera person
post för att ha ett city_id
av 2 eller 3, och skulle då kunna ta bort New York. Tanken är att du inte kan göra detta av misstag och lämna föräldralösa data bakom sig - ett person_id
pekar på en city
som inte längre finns.
Om du försökte skapa en person
spela in med ett city_id
värde som inte matchar ett city.id
värde:
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
... då skulle du få ett felmeddelande (ORA-02291) att den överordnade nyckeln - det vill säga ett matchande id
värde i city
tabeller - finns inte.
Du kan läsa mer om främmande nycklar i databaskoncepten guide .