Saya tidak sepenuhnya yakin apa yang Anda maksud dengan 'input ID yang salah', tetapi saya akan menganggap yang Anda maksud adalah ID yang tidak valid, bukan hanya kesalahan (seperti mengatakan seseorang berada di kota yang berbeda dengan tempat mereka sebenarnya adalah).
Batasan kunci asing berarti bahwa nilai yang dimasukkan dalam person
tabel untuk city_id
memiliki ada sebagai kunci utama di city
meja. Mereka tidak dapat memasukkan nilai lama sebagai city_id
, hanya nilai yang valid. Dan city
yang sesuai baris tidak dapat dihapus tanpa menghapus/mengubah referensi di person
tabel (mis. memperbarui ke nilai valid yang berbeda), atau - tidak mungkin dalam kasus ini - mengalirkan penghapusan sehingga person
mana pun catatan untuk city
dihapus.
Jadi katakanlah Anda membuat tabel sebagai:
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));
Anda memiliki tiga catatan di city
. Anda tabel:
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');
Kemudian Anda dapat menambahkan person
yang tinggal di New York dengan mencantumkan ID kota tersebut:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);
(SQL Fiddle )
Anda tidak mendenormalisasi data di city
yang cocok catatan, jadi jika New York memutuskan untuk mengubah namanya kembali menjadi New Amsterdam, katakanlah, itu akan menjadi pembaruan tunggal untuk city
rekam dan Anda tidak perlu menyentuh person
any catatan untuk orang-orang di kota itu.
Jika Anda mencoba menghapus city
record untuk New York, Anda akan mendapatkan kesalahan (ORA-02292) yang mengatakan bahwa ada catatan anak. Anda dapat memperbarui person
catatan memiliki city_id
dari 2 atau 3, dan kemudian dapat menghapus New York. Idenya adalah Anda tidak dapat melakukan ini secara tidak sengaja dan meninggalkan data yatim - person_id
menunjuk ke city
yang sudah tidak ada lagi.
Jika Anda mencoba membuat person
rekam dengan city_id
nilai yang tidak cocok dengan city.id
nilai:
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
... maka Anda akan mendapatkan kesalahan (ORA-02291) bahwa kunci induk - yaitu, id
yang cocok nilai di city
tabel - tidak ada.
Anda dapat membaca lebih lanjut tentang kunci asing di konsep database panduan .