1
DECLARE    
 cursor curs is select * from starting;  
 appleId number;      
 bananaId number;    
BEGIN  
    for foo in curs  
    LOOP     
        insert into apple (id, weight)  
        values(1,1)  
        returning id into appleId;  
        insert into banana(id,weight)  
        values(1,3)  
        returning id into bananaId;  
        insert into apple_banana_lookup  
        values(1,appleId,bananaId);  
    END LOOP;  
    COMMIT;   
END;  

上記のコードは、外部キー制約違反になります。IDのフィールドがAppleまだ存在していないと主張します。私の質問は、このコードを上記のように機能させ、apple_banana_lookupテーブルにappleIdとで参照されるキーを正常に永続化させる方法ですbananaId。追加として、特定のカーソルに最大2億のレコードが存在するため、挿入のたびにコミットする必要がないようにしappleます。banana

アップデート

スキーマ宣言:

    create table apple  
    ( 
        id number(20,0) not null, 
        weight number (20,0)   
    );

    create table banana  
    (   
         id number(20,0) not null, 
         weight number(20,0)  
    )  ;

    create table apple_banana_lookup  
( 
      id number(20,0) not null,
      appleId number(20,0) not null,
      bananaId number(20,0) not null   
      CONSTRAINT "apple_fk" foreign key ("appleId")  
      REFERENCES "apple" ("id"),  
     CONSTRAINT "banana_fk" foreign key ("bananaId")  
      REFERENCES "banana" ("id"),
);  

エラーメッセージ:

ORA-02291: integrity constraint  
parent key not found
4

3 に答える 3

2

説明に何かが欠けているようです-テーブルが正しく作成されている場合、コードは正しく機能しているように見えます

appleこれが、banana、およびテーブルの定義方法であると想定しています (insert intoで列リストを指定していないため、テーブル内の列が PL/SQL ブロックとして順序付けられていることにapple_banana_lookup注意してください)apple_banana_lookupそれらがそうであることを期待しているようです)。

SQL> create table apple(
  2    id number primary key,
  3    weight number
  4  );

Table created.

SQL> create table banana(
  2    id number primary key,
  3    weight number
  4  );

Table created.

SQL> create table apple_banana_lookup (
  2    id number primary key,
  3    appleID number references apple(id),
  4    bananaID number references banana(id)
  5  );

Table created.

コードを変更しないようにするために、starting1行のテーブルを作成しました

SQL> create table starting( id number );

Table created.

SQL> insert into starting values( 1 );

1 row created.

今、あなたが投稿したとおりにコードを実行します。エラーは生成されず、各テーブルに 1 行が挿入されます。

SQL> DECLARE
  2   cursor curs is select * from starting;
  3   appleId number;
  4   bananaId number;
  5  BEGIN
  6      for foo in curs
  7      LOOP
  8          insert into apple (id, weight)
  9          values(1,1)
 10          returning id into appleId;
 11          insert into banana(id,weight)
 12          values(1,3)
 13          returning id into bananaId;
 14          insert into apple_banana_lookup
 15          values(1,appleId,bananaId);
 16      END LOOP;
 17      COMMIT;
 18  END;
 19  /

PL/SQL procedure successfully completed.

SQL> select * from apple_banana_lookup;

        ID    APPLEID   BANANAID
---------- ---------- ----------
         1          1          1
于 2012-08-09T15:48:29.247 に答える
1
create table apple  
( 
    id number(20,0) not null, 
    weight number (20,0)   
);  --No primary keys here

create table banana  
(   
     id number(20,0) not null, 
     weight number(20,0)  
)  ;  -- No primary keys here


create table apple_banana_lookup  
( 
      id number(20,0) not null,
      appleId number(20,0) not null,
      bananaId number(20,0) not null,   
      CONSTRAINT apple_fk foreign key (appleId)  
      REFERENCES apple(id),   --this wont work
     CONSTRAINT banana_fk foreign key (bananaId)  
      REFERENCES banana(id)  --this wont work
);  

上記の作成に関するステートメントが機能するようには見えませんapple_banana_lookup。テーブルの参照整合性はapple_banana_lookup、参照テーブルの一意のキーを参照する必要があります。これが本来あるべき姿です

create table apple  
( 
  id number(20,0) not null, 
  weight number (20,0) ,
  CONSTRAINT apple_pk PRIMARY KEY (id)
);

create table banana  
(   
  id number(20,0) not null, 
  weight number(20,0) , 
  CONSTRAINT banana_pk PRIMARY KEY (id)
)  ;

create table apple_banana_lookup  
( 
      id number(20,0) not null,
      appleId number(20,0) not null,
      bananaId number(20,0) not null,  
      CONSTRAINT app_ban_pk PRIMARY KEY (appleId, bananaId),
      CONSTRAINT apple_fk foreign key (appleId)  
      REFERENCES apple(id),  
     CONSTRAINT banana_fk foreign key (bananaId)  
      REFERENCES banana(id)
); 

これを持っているので、以下は魅力のように機能します(ループを除いてあなたのものと同じです)-

SQL> DECLARE    
 appleId number;      
 bananaId number;    
BEGIN    
        insert into apple (id, weight)  
        values(1,1)  
        returning id into appleId;  
        insert into banana(id,weight)  
        values(1,3)  
        returning id into bananaId;  
        insert into apple_banana_lookup  
        values(1,appleId,bananaId);      
    COMMIT;   
END; 
/

PL/SQL block completed successfully.


SQL> select * from apple;
                  ID               WEIGHT
-------------------- --------------------
                   1                    1

SQL> select * from banana;
                  ID               WEIGHT
-------------------- --------------------
                   1                    3 

SQL> select * from apple_banana_lookup;
                  ID              APPLEID             BANANAID
-------------------- -------------------- --------------------
                   1                    1                    1 
于 2012-08-09T15:51:39.500 に答える
0

AFAIR データはトランザクション内で常に表示されるため、以前の INSERT ステートメントで挿入されたデータを参照できるはずです。
エラーはフィールド値ではなくフィールド名を参照していると思われます。エラーの詳細をもう少し詳しく教えていただければ、より適切なサポートを提供できます。
制約のソースも確認してください。

于 2012-08-09T15:41:21.127 に答える