Non sono del tutto sicuro di cosa intendi per "immissione di un ID errato", ma presumo che tu intenda un ID che non è valido, piuttosto che un semplice errore (come dire che qualcuno si trova in una città diversa da quella in cui si trova davvero sono).
Il vincolo di chiave esterna significa che il valore che inseriscono nella person
tabella per city_id
ha esistere come chiave primaria nella city
tavolo. Non possono inserire alcun vecchio valore come city_id
, solo valori validi. E la corrispondente city
la riga non può quindi essere eliminata senza rimuovere/modificare il riferimento nella person
tabella (ad es. l'aggiornamento a un valore valido diverso) o - improbabile in questo caso - l'eliminazione a cascata in modo che qualsiasi person
record per la city
vengono cancellati.
Quindi diciamo che crei le tue tabelle come:
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));
Hai tre record nella tua city
tabella:
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');
Quindi puoi aggiungere una person
che vive a New York includendo l'ID di quella città:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);
(SQL Fiddle )
Non stai denormalizzando i dati nella city
corrispondente record, quindi se New York decidesse di cambiare il suo nome in New Amsterdam, diciamo, si tratterebbe di un unico aggiornamento per la city
record e non dovresti toccare nessuna person
record per le persone in quella città.
Se hai provato a eliminare la city
record per New York, riceveresti un errore (ORA-02292) che dice che esisteva un record figlio. Puoi aggiornare la person
record per avere un city_id
di 2 o 3 e sarebbe quindi in grado di eliminare New York. L'idea è che non puoi farlo per caso e lasciare dati orfani dietro:un person_id
che punta a una city
che non esiste più.
Se hai provato a creare una person
registra con un city_id
valore che non corrisponde a un city.id
valore:
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
... quindi otterresti un errore (ORA-02291) che la chiave genitore, ovvero un id
corrispondente valore nella city
tabelle - non esiste.
Puoi leggere ulteriori informazioni sulle chiavi esterne in i concetti del database guida .