11

これは、Oracle データベースに複数の行を挿入するために使用したクエリです。しかし、その中でシーケンスを使用すると、ORA-00001: 一意の制約としてエラーが発生します。どうやってするの。

INSERT ALL
  INTO POSTAL_CODE( postal_code,desc)
    VALUES(postal_code.NEXTVAL,'Coimbatore')
  INTO POSTAL_CODE (postal_code,desc)
    VALUES(postal_code.NEXTVAL,'Mumbai') SELECT * FROM DUAL;
4

5 に答える 5

22

マルチテーブルの挿入に関する制限事項は次のとおりです。

  • マルチテーブル挿入ステートメントのどの部分にもシーケンスを指定することはできません。複数テーブルの挿入は、単一の SQL ステートメントと見なされます。したがって、NEXTVAL への最初の参照は次の番号を生成し、ステートメント内の後続のすべての参照は同じ番号を返します。

これは正しくありません。シーケンスを使用できます。常に同じ値を取得するため、同じシーケンスを参照して親レコードと子レコードを一度に作成すると便利です。

引き続き使用したい場合insert allは、シーケンス値を取得する非決定論的関数を使用して回避できます。

CREATE FUNCTION get_seq RETURN NUMBER IS
BEGIN
  RETURN postal_code_seq.nextval;
END;
/

INSERT ALL
  INTO POSTAL_CODE( postal_code,description)
    VALUES(get_seq,'Coimbatore')
  INTO POSTAL_CODE (postal_code,description)
    VALUES(get_seq,'Mumbai') SELECT * FROM DUAL;

2 rows inserted.

SELECT * FROM postal_code;

                            POSTAL_CODE DESCRIPTION        
--------------------------------------- --------------------
                                      1 Coimbatore          
                                      2 Mumbai              

しかし、それは少し厄介です。おそらく、個々の挿入ステートメントを使用する方が良いでしょう-単一のテーブルへのマルチテーブル挿入を使用しても、実際にはあまり得られません-または、シーケンスから一意の列を設定するトリガー、または値を生成するCTE /インラインビュー挿入します。

于 2015-08-12T15:16:22.403 に答える
3

このメソッドの代わりに、挿入前トリガーを使用してキー列を設定します (挿入によって値が提供されていない場合)。シーケンスは、複数テーブルの挿入ではうまく機能しません。

于 2015-08-12T15:11:35.290 に答える
-5

この複数行をOracleデータベースに挿入してみてください

INTO POSTAL_CODE (postal_code,desc)
VALUES(&postal_code,&desc) SELECT * FROM DUAL;
于 2015-08-12T14:34:16.750 に答える