「間違った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
に3つのレコードがあります 表:
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
を追加できます その都市のIDを含めることでニューヨークに住んでいる人:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);
(SQLフィドル )
一致するcity
のデータを非正規化していない たとえば、ニューヨークが名前をニューアムステルダムに戻すことにした場合、それはcity
への1回の更新になります。 記録すれば、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);
...次に、親キー(つまり、一致するid
)というエラー(ORA-02291)が発生します。 city
の値 テーブル-存在しません。
外部キーの詳細については、データベースの概念を参照してください。ガイド 。