Nejsem si úplně jistý, co máte na mysli „nesprávným zadáním ID“, ale předpokládám, že máte na mysli ID, které není platné, spíše než pouhou chybu (jako když řeknete, že někdo je v jiném městě, než kde skutečně jsou).
Omezení cizího klíče znamená, že hodnotu zadávají do person
tabulka pro city_id
má existovat jako primární klíč v city
stůl. Nemohou vložit žádnou starou hodnotu jako city_id
, pouze platné hodnoty. A odpovídající city
řádek pak nelze smazat bez odstranění/změny odkazu v person
tabulky (např. aktualizace na jinou platnou hodnotu), nebo - v tomto případě nepravděpodobné - kaskádové mazání tak, aby jakákoli person
záznamy pro city
jsou smazány.
Řekněme, že vytvoříte své tabulky 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));
Ve vašem city
máte tři záznamy tabulka:
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');
Poté můžete přidat person
který žije v New Yorku uvedením ID tohoto města:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);
(SQL Fiddle )
Nedenormalizujete data v odpovídajícím city
záznam, takže pokud by se New York rozhodl změnit svůj název zpět na Nový Amsterdam, řekněme, šlo by o jedinou aktualizaci city
záznam a nemuseli byste se dotknout žádné person
záznamy pro lidi v daném městě.
Pokud jste se pokusili smazat city
záznam pro New York, zobrazí se chyba (ORA-02292), která říká, že existuje podřízený záznam. Můžete aktualizovat person
záznam mít city_id
2 nebo 3, a pak by bylo možné smazat New York. Myšlenka je taková, že to nemůžete udělat náhodou a nechat po sobě osiřelá data – person_id
ukazující na city
který již neexistuje.
Pokud jste se pokusili vytvořit person
záznam s city_id
hodnota, která neodpovídá city.id
hodnota:
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
... pak byste dostali chybu (ORA-02291), že nadřazený klíč – tedy odpovídající id
hodnotu v city
tabulky – neexistuje.
Další informace o cizích klíčích si můžete přečíst v koncepty databáze průvodce .