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

不適切に使用された外部キーのSQLエラー「親キーが見つかりません」?

    残念ながら(DDLコードについて)@ William Robertsonに同意する必要があります。モデルを変更する必要があるため、DDLコードを完全に作り直す必要があります。この理由は次のとおりです。

    元のDDLコードからリバースエンジニアリングされたモデルを見ると、REQUISITIONには3つ(申し訳ありませんが、4つ)の親テーブルがあることがわかります。そのため、外部キー違反が原因で、挿入が常に失敗します。モデル:

    DDLコードの形式で問題を説明する単純化された例は、次のようになります。

    create table parent1 ( id number primary key ) ; -- analogy: supplies_pharmaceutical
    create table parent2 ( id number primary key ) ; -- analogy: supplies_nonsurgical
    create table parent3 ( id number primary key ) ; -- analogy: supplies_surgical
    
    create table child ( -- analogy: requisitions
      id number primary key
    , parentid number 
    );
    
    alter table child add constraint fkey_parent1
    foreign key ( parentid ) references parent1 ( id ) ;
    
    alter table child add constraint fkey_parent2
    foreign key ( parentid ) references parent2 ( id ) ;
    
    alter table child add constraint fkey_parent3
    foreign key ( parentid ) references parent3 ( id ) ;
    
    begin
      insert into parent1 ( id ) values ( 1 ) ;
      insert into parent2 ( id ) values ( 2 ) ;
      insert into parent3 ( id ) values ( 3 ) ;
    end ;
    /
    

    したがって、親テーブルにデータが入力されているので、簡単に確認してください:

    select 'parent1 (id) -> ' || id from parent1
    union all
    select 'parent2 (id) -> ' ||  id from parent2
    union all
    select 'parent3 (id) -> ' ||  id from parent3
    ;
    
    -- result
    'PARENT1(ID)->'||ID  
    parent1 (id) -> 1    
    parent2 (id) -> 2    
    parent3 (id) -> 3 
    

    すべて良い。次に、子テーブルにいくつかの行を挿入します。

    insert into child ( id, parentid ) values ( 100, 1 ) ;
    -- ORA-02291: integrity constraint (...FKEY_PARENT3) violated - parent key not found
    
    insert into child ( id, parentid ) values ( 101, 2 ) ;
    -- ORA-02291: integrity constraint (...FKEY_PARENT3) violated - parent key not found
    
    insert into child ( id, parentid ) values ( 102, 3 ) ;
    -- ORA-02291: integrity constraint (...FKEY_PARENT2) violated - parent key not found
    

    正しい親テーブルは「自動的に選択される」だけではないことがわかります。

    ウィリアムのモデルOTOHでは、REQUISITIONには「サプライ」に関して1つの親(テーブル)しかありません。これにより、行の挿入がはるかに簡単になります...以下を参照してください。



    1. 日時を使用する場合のMySQLGROUPBYの日付

    2. チェコ語のPostgresql全文検索(デフォルトの言語設定なし)

    3. SQL Serverはどのカーディナリティーでインデックススキャンに切り替えますか(シークに対して)

    4. MySQLに接続して、PlayFramework2.4で操作を実行できません