Не съм напълно сигурен какво имате предвид под „неправилно въвеждане на ID“, но предполагам, че имате предвид ID, който не е валиден, а не просто грешка (като да кажете, че някой е в град, различен от този, в който наистина са).
Ограничението за външен ключ означава, че стойността, която въвеждат в person
таблица за city_id
има да съществува като първичен ключ в city
маса. Те не могат да поставят стара стойност като city_id
, само валидни стойности. И съответния city
след това ред не може да бъде изтрит без премахване/промяна на препратката в person
таблица (напр. актуализиране до различна валидна стойност) или - малко вероятно в този случай - каскадно изтриване, така че всяко person
записи за city
се изтриват.
Да кажем, че създавате своите таблици като:
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));
Имате три записа във вашия city
таблица:
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');
След това можете да добавите person
който живее в Ню Йорк, като включи идентификационния номер на този град:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);
(SQL Fiddle )
Не денормализирате данните в съответстващия city
запис, така че ако Ню Йорк реши да промени името си обратно на Нов Амстердам, да речем, това ще бъде единична актуализация на city
запишете и няма да се налага да докосвате person
записи за хора в този град.
Ако се опитате да изтриете city
запис за Ню Йорк, ще получите грешка (ORA-02292), която казва, че съществува дъщерен запис. Можете да актуализирате person
запис, за да има city_id
от 2 или 3 и след това ще можете да изтриете Ню Йорк. Идеята е, че не можете да направите това случайно и да оставите осиротели данни - person_id
сочещи към city
който вече не съществува.
Ако сте опитали да създадете person
запис с city_id
стойност, която не съответства на city.id
стойност:
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
... тогава ще получите грешка (ORA-02291), че родителският ключ - тоест съответстващ id
стойност в city
таблици - не съществува.
Можете да прочетете повече за външните ключове в концепциите за бази данни ръководство .