Ik weet niet helemaal zeker wat je bedoelt met 'verkeerde ID-invoer', maar ik neem aan dat je een ID bedoelt die niet geldig is, in plaats van alleen een fout (zoals zeggen dat iemand zich in een andere stad bevindt dan waar ze echt zijn).
De externe sleutelbeperking betekent dat de waarde die ze invoeren in de person
tabel voor city_id
heeft bestaan als primaire sleutel in de city
tafel. Ze kunnen geen oude waarde invoeren als een city_id
, alleen geldige waarden. En de bijbehorende city
rij kan dan niet worden verwijderd zonder de verwijzing in de person
. te verwijderen/wijzigen tabel (bijv. bijwerken naar een andere geldige waarde), of - in dit geval onwaarschijnlijk - de verwijdering trapsgewijs uitvoeren zodat een person
records voor de city
worden verwijderd.
Dus laten we zeggen dat u uw tabellen maakt als:
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));
Je hebt drie records in je city
tafel:
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');
Dan kun je een person
toevoegen die in New York woont door de ID van die stad op te nemen:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);
(SQL Fiddle )
U denormaliseert de gegevens in de overeenkomende city
niet record, dus als New York zou besluiten zijn naam terug te veranderen in Nieuw Amsterdam, bijvoorbeeld, zou dat een enkele update zijn van de city
opnemen en u hoeft geen person
aan te raken records voor mensen in die stad.
Als u heeft geprobeerd de city
. te verwijderen record voor New York, krijgt u een foutmelding (ORA-02292) dat er een onderliggend record bestaat. Je zou de person
kunnen updaten record om een city_id
. te hebben van 2 of 3, en zou dan New York kunnen verwijderen. Het idee is dat je dit niet per ongeluk kunt doen en verweesde gegevens achterlaten - een person_id
wijzend naar een city
die niet meer bestaat.
Als je hebt geprobeerd een person
aan te maken opnemen met een city_id
waarde die niet overeenkomt met een city.id
waarde:
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
... dan krijg je een foutmelding (ORA-02291) dat de bovenliggende sleutel - dat wil zeggen, een overeenkomende id
waarde in de city
tabellen - bestaat niet.
U kunt meer lezen over externe sleutels in de databaseconcepten gids .