「間違った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に触れる必要はありません。personその街で。
New Yorkのレコードを削除しようとするcityと、子レコードが存在するというエラー (ORA-02292) が発生します。personレコードを更新して acity_idを 2 または 3 にすると、ニューヨークを削除できます。これは、誤ってこれを行うことができず、孤立したデータ (もはや存在しないperson_idを指している) を残すことができないという考え方です。city
値と一致しない値でpersonレコードを作成しようとした場合:city_idcity.id
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
id...すると、親キー、つまりテーブル内の一致する値がcity存在しないというエラー (ORA-02291) が発生します。
外部キーの詳細については、データベース コンセプト ガイドを参照してください。