sql >> データベース >  >> RDS >> Oracle

テーブルに外部キーを挿入する方法

    「間違った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の値 テーブル-存在しません。

    外部キーの詳細については、データベースの概念を参照してください。ガイド



    1. データベース内の各テーブルにmysqlクエリを適用します

    2. 特定のパターンに従ってリスト内のアイテムを再配置するにはどうすればよいですか?

    3. 2番目の列から最大の日付値を持つ列に基づいて個別の値を選択します

    4. mysqlのexecuteステートメントからの戻り値を保存できません