INSERT ステートメント
INSERT ステートメントは、 表、ニックネーム、またはビュー、あるいは指定された全選択の基礎になる表、 ニックネーム、またはビューに、行を挿入します。
行をニックネームに挿入することは、 その行をそのニックネームが参照するデータ・ソース・オブジェクトに挿入することでもあります。 このビューに対する挿入操作用に INSTEAD OF トリガーが定義されていない場合、 行をビューに挿入することは、その行をそのビューの基本となる表に挿入することでもあります。 このようなトリガーが定義されている場合は、トリガーが代わりに実行されます。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 このステートメントは、動的に作成できる実行可能ステートメントです。
許可
- ターゲット表、ビュー、またはニックネームに対する INSERT 特権
- ターゲット表、ビュー、またはニックネームに対する CONTROL 特権
- ターゲットとなる表、ビュー、またはニックネームが含まれるスキーマに対する INSERTIN 特権
- ターゲットとなる表、ビュー、またはニックネームが含まれるスキーマに対するスキーマ DATAACCESS 権限
- DATAACCESS 権限
- SELECT 特権
- CONTROL 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対するスキーマ DATAACCESS 権限
- DATAACCESS 権限
静的 INSERT ステートメントの場合、GROUP 特権はチェックされません。
挿入操作の対象がニックネームの場合は、データ・ソースでステートメントが実行されないうちは、 そのデータ・ソース上のオブジェクトに対する特権は考慮されません。 この時点で、データ・ソースに接続するために使用される許可 ID は、 データ・ソースのオブジェクトに対して操作を行うのに必要な特権を持っている必要があります。 ステートメントの許可 ID は、データ・ソースの別の許可 ID へマップできます。
構文
説明
- INTO table-name、view-name、nickname、または (fullselect)
- 挿入操作の対象のオブジェクトを指定します。
名前は、以下のいずれかのオブジェクトを示すものでなければなりません。
- アプリケーション・サーバーに存在する表、ビュー、またはニックネーム
- remote-object-name を使用して指定されたリモート・サーバーにある表またはビュー
挿入操作のオブジェクトが全選択である場合、CREATE VIEW ステートメントの説明の『注』にある『挿入可能ビュー』という項目で定義されているように、全選択が挿入可能になっている必要があります。
挿入操作のオブジェクトがニックネームである場合は、DEFAULT および UNASSIGNED の拡張標識変数の値は使用できません (SQLSTATE 22539)。
このビューに対する挿入操作用に INSTEAD OF トリガーがない場合、 以下のエレメントのようなビューの列には、値を挿入することはできません。- 定数、式、またはスカラー関数から得られる列。
- そのビューの他の列と同じ基本表の列から得られる列。
挿入操作の対象となるビューにこのような列がある場合は、 列名のリストを指定する必要があり、そのリストに上記の列を指定してはなりません。
行が基礎となる基本表のうち 1 つだけのチェック制約を満たしている場合、 UNION ALL を使用して定義されているビューまたは全選択にその行を挿入できます。 行が複数の表のチェック制約を満たしている場合や、どの表のチェック制約も満たしていない場合は、 エラーが戻されます (SQLSTATE 23513)。
ビューのいずれかの基本表に BEFORE トリガーが含まれ、BEFORE トリガーに UPDATE、DELETE、INSERT のいずれかの操作、またはそれらの操作が組み込まれたルーチンを呼び出す操作が組み込まれている場合、そのビュー、または UNION ALL を使用して定義された全選択に行を挿入することはできません (SQLSTATE 42987)。
- (column-name,...)
- 挿入する値の対象となる列を、各 column-name に指定します。
それぞれの名前は、指定された表、ビュー、またはニックネームの列、あるいは全選択の列を指定しなければなりません。
同じ列を複数回指定することはできません。
拡張標識変数が使用可能でない場合は、挿入値を受け入れることのできない列 (例えば、式を基にした列) を指定することはできません。
列のリストを省略すると、(暗黙的に隠されていない) 表またはビューのすべての列、あるいは全選択の選択リストのすべての項目を左から右に並べたリストが暗黙に指定されます。 このリストはステートメントが準備される時点で確立されます。 したがって、ステートメントの準備後に表に追加された列は含まれません。
- include-columns
- 全選択の FROM 節にネストされているとき、
table-name や view-name などの列と一緒に INSERT ステートメントの中間結果表に組み込まれている列セットを指定します。
include-columns は、
table-name や view-name で指定されている列のリストの最後に付加されます。
- INCLUDE
- INSERT ステートメントの中間結果表に組み込まれる列のリストを指定します。 この節は、INSERT ステートメントが全選択の FROM 節にネストされている場合にのみ指定できます。
- column-name
- INSERT ステートメントの中間結果表の列を指定します。 名前は、他の組み込み列や、 table-name または view-name の列と同じ名前であってはなりません (SQLSTATE 42711)。
- data-type
- 組み込み列のデータ・タイプを指定します。 データ・タイプは、CREATE TABLE ステートメントでサポートされているものでなければなりません。
- VALUES
- 挿入する 1 つ以上の行の値を、この後に指定します。
VALUES 節で指定された各行は、行変数が使用されていない限り、暗黙的または明示的な列のリスト、および INCLUDE 節で指定された列に割り当て可能でなければなりません。 括弧内の行の値リストが指定されると、最初の値はリストの最初の列に挿入され、2 番目の値は 2 番目の列に挿入されるといった具合で続きます。行式を指定した場合は 、行タイプ内のフィールドの数は、暗黙的または明示的な列のリストにある名前の数と一致していなければなりません。
- expression
- expression には、トピック『式』で定義されている式を指定できます。expression が行タイプの場合、括弧内に入れないでください。expression が変数である場合は、拡張標識変数を使用できる標識変数 (またはホスト構造の場合は標識配列) をホスト変数に組み込むことができます。拡張標識変数が使用可能であり、以下の内容のいずれかが該当する場合は、デフォルト (-5) または未割り当て (-7) の拡張標識変数の値は使用できません (SQLSTATE 22539)。
- 式が明示的キャストによる単一ホスト変数より複雑な場合
- ターゲット列が構造化タイプのデータ・タイプを持つ場合
- NULL
- NULL 値を指定します。 これは NULL 可能の列に対してのみ指定できます。
- DEFAULT
- デフォルト値を使用することを指定します。
DEFAULT を指定したときに使用される値は、
該当の列がどのように定義されているかによって決まります。次のとおりです。
- 式に基づいて生成される列として列が定義されている場合は、その式に基づいた列の値がシステムによって生成されます。
- IDENTITY 節が使用されている場合は、 データベース・マネージャーによって値が生成されます。
- ROW CHANGE TIMESTAMP 節を使用すると、データベース・マネージャーによって、データベース・パーティション内の表パーティションごとの固有のタイム・スタンプ値が、挿入される各行に生成されます。
- WITH DEFAULT 節が使用されている場合は、 その列に対して定義された値が挿入されます (『CREATE TABLE』 の default-clause を参照してください)。
- NOT NULL 節が使用されているが GENERATED 節は使用されていない場合、 または WITH DEFAULT 節は使用されていないか DEFAULT NULL が使用されている場合は、 その列に対して DEFAULT キーワードを指定することができません (SQLSTATE 23502)。
- ニックネームに挿入する場合、 データ・ソースが照会言語構文中の DEFAULT キーワードをサポートしている場合に限り、 DEFAULT キーワードはそのデータ・ソースに対して INSERT ステートメントをパススルーします。
- row-expression
- 列名が含まれていない、『行式』で記述されているタイプの行式を指定します。この行内のフィールド数は挿入のターゲットと一致しなければならず、各フィールドは対応する列に割り当て可能でなければなりません。
- WITH common-table-expression
- 後続の fullselect で使用する共通表式を定義します。
- fullselect
- 新しい行の集合を、全選択の結果表の形式で指定します。
行の数は、1 つか、複数か、またはゼロのいずれかです。 結果表が空の場合、SQLCODE は +100 に設定され、
SQLSTATE は '02000' に設定されます。
INSERT の基本オブジェクトおよび全選択の基本オブジェクトまたは全選択の副照会のいずれかが同一の表である場合、 行挿入の前に、全選択が完全に評価されます。
結果表の列の数は、列リストの名前の数と同じでなければなりません。 結果の最初の列の値はリストの最初の列に挿入され、 2 番目の値は 2 番目の列に挿入されます。 以下同様です。
結果列の値を指定する式が変数の場合は、拡張標識変数を使用できる標識変数をホスト変数に組み込めます。拡張標識変数が使用可能であり、expression が複数のホスト変数で成っているか、またはホスト変数が明示的にキャストされている場合は、デフォルトまたは未割り当ての拡張標識変数の値は使用できません (SQLSTATE 22539)。 デフォルトまたは未割り当ての値の効果は、fullselect の対応するターゲット列に適用されます。
- WITH
- ステートメントが実行される分離レベルを指定します。
- RR
- 反復可能読み取り
- RS
- 読み取り固定
- CS
- カーソル固定
- UR
- 非コミット読み取り
規則
- トリガー: INSERT ステートメントによってトリガーの実行が引き起こされる場合があります。 トリガーが他のステートメントの実行を引き起こす場合や、 挿入値に起因するエラーが発生する場合があります。 ビューに挿入操作を行うと INSTEAD OF トリガーが起動する場合は、 そのトリガーによって実行される更新に対して妥当性、参照整合性、および制約がチェックされます。 トリガーを起動させたビューやその基礎表に対するチェックは行われません。
- デフォルト値: 列リストにない列に挿入される値は、 列のデフォルト値または NULL 値のいずれかになります。 NULL 可能でない列で NOT NULL WITH DEFAULT として定義されていない列は、 列リストに含める必要があります。 同様に、ビューへの挿入の場合、基本表の列で、ビューにはない列に挿入される値は、 その列のデフォルト値か、または NULL 値のいずれかになります。 したがって、基本表に存在し、ビューにはない列はすべて、 デフォルト値があるか、または NULL 可能であるかのいずれかでなければなりません。 生成される列が GENERATED ALWAYS 節で定義されている場合は、 DEFAULT 以外の値を挿入することはできません (SQLSTATE 428C9)。
- 長さ: 列の挿入値が数値の場合、 列はその数の整数部分を入れる容量を持つ数値列でなければなりません。 列の挿入値がストリングの場合、列は、長さ属性がそのストリングの長さ以上である列であるか、 またはストリングが日付、時刻、またはタイム・スタンプを表す場合は、 日付/時刻列でなければなりません。
- 割り当て: 挿入値は、特定の割り当ての規則に従って列に割り当てられます。
- 妥当性: 指定された表または指定されたビューの基本表に 1 つまたは複数のユニーク索引がある場合、
表に挿入される各行は、それらの索引の制約に適合していなければなりません。
その定義に WITH CHECK OPTION を伴うビューが指定された場合、
そのビューに挿入する各行は、そのビューの定義に適合していなければなりません。
この状況に関連する規則については、
CREATE VIEW
を参照してください。 - 参照整合性: 表に対して定義されている制約ごとに、外部キーの挿入値のうち NULL 以外の値は、それぞれ親表の主キーの値に等しくなければなりません。
- チェック制約: 挿入値は、表に定義されているチェック制約のチェック条件を満たしていなければなりません。チェック制約が定義されている表に対する INSERT では、 挿入される各行ごとに一度、制約条件が評価されます。
- XML 値: XML 列に挿入する値は、整形式 XML 文書でなければなりません (SQLSTATE 2200M)。
- セキュリティー・ポリシー: 指定された表または指定されたビューの基本表がセキュリティー・ポリシーで保護されている場合、セッション許可 ID は、以下を許可するラベル・ベースのアクセス制御 (LBAC) 信用証明情報を持っている必要があります。
- データ値が明示的に提供される、保護されたすべての列に対する書き込みアクセス (SQLSTATE 42512)
- RESTRICT NOT AUTHORIZED WRITE SECURITY LABEL オプションを使って生成されたセキュリティー・ポリシーに関して Db2SECURITYLABEL 列に明示的に与えられる値に対する書き込みアクセス (SQLSTATE 23523)
さらに、Db2SECURITYLABEL 列に暗黙的な値が使用される場合には、セキュリティー・ポリシーの書き込みアクセスに関するセキュリティー・ラベルもまた、セッション許可 ID に付与されている必要があります (SQLSTATE 23523)。このような暗黙的な値は、以下の場合に使用される可能性があります。
- Db2SECURITYLABEL 列の値が明示的に提供されていない
- Db2SECURITYLABEL 列の値が明示的に提供されているが、セッション許可 ID がその値に対する書き込みアクセスを持たず、OVERRIDE NOT AUTHORIZED WRITE SECURITY LABEL オプションを使ってセキュリティー・ポリシーが生成されている
- 拡張標識変数の使用法: 使用可能な場合は、-1 から -7 までの範囲外にある負の標識変数値を入力にすることはできません (SQLSTATE 22010)。また、デフォルトおよび未割り当ての拡張標識変数の値が使用可能な場合に、それらがサポートされないコンテキストで使用してはなりません (SQLSTATE 22539)。
- 拡張標識変数: INSERT ステートメント内で、未割り当ての値には、列をデフォルト値に設定する効果があります。
ターゲット列が GENERATED ALWAYS として定義されている場合、DEFAULT キーワード、またはデフォルトか未割り当ての拡張標識変数ベースの値を割り当てる必要があります (SQLSTATE 428C9)。
例
- 例 1: DEPARTMENT 表に、以下の指定で新しい部門を挿入します。
- 部門番号 (DEPTNO) は 'E31'
- 部門名 (DEPTNAME) は 'ARCHITECTURE'
- その管理者の社員番号 (MGRNO) は '00390'
- 報告先の部門 (ADMRDEPT) は 'E01'
INSERT INTO DEPARTMENT VALUES ('E31', 'ARCHITECTURE', '00390', 'E01') - 例 2: 例 1 と同様に DEPARTMENT 表に新しい部門を挿入しますが、
新しい部門に管理者は割り当てません。
INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT ) VALUES ('E31', 'ARCHITECTURE', 'E01') - 例 3: 例 2 と同様の DEPARTMENT 表に 2 つの新しい部門を 1 つのステートメントを使用して挿入しますが、
新しい部門に管理者は割り当てません。
INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT) VALUES ('B11', 'PURCHASING', 'B01'), ('E41', 'DATABASE ADMINISTRATION', 'E01') - 例 4: EMP_ACT 表と同じ列を持つ一時表 MA_EMP_ACT を作成します。
EMP_ACT 表から、'MA' で始まるプロジェクト番号 (PROJNO) を持つ行を MA_EMP_ACT 表にロードします。
CREATE TABLE MA_EMP_ACT ( EMPNO CHAR(6) NOT NULL, PROJNO CHAR(6) NOT NULL, ACTNO SMALLINT NOT NULL, EMPTIME DEC(5,2), EMSTDATE DATE, EMENDATE DATE ) INSERT INTO MA_EMP_ACT SELECT * FROM EMP_ACT WHERE SUBSTR(PROJNO, 1, 2) = 'MA' - 例 5: C プログラムのステートメントを使用して、
PROJECT 表にスケルトン・プロジェクトを追加します。
プロジェクト番号 (PROJNO)、プロジェクト名 (PROJNAME)、
部門番号 (DEPTNO)、および責任者 (RESPEMP) は、ホスト変数から入手します。
プロジェクトの開始日 (PRSTDATE) として、現在の日付を使用します。表のその他の列には、NULL 値を割り当てます。
EXEC SQL INSERT INTO PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP, PRSTDATE) VALUES (:PRJNO, :PRJNM, :DPTNO, :REMP, CURRENT DATE); - 例 6: SELECT ステートメントで、INSERT ステートメントを data-change-table-reference として指定します。
VALUE 節で値が指定されている組み込み列を別に定義し、それを、挿入される行の配列用の列として使用します。
SELECT INORDER.ORDERNUM FROM NEW TABLE (INSERT INTO ORDERS(CUSTNO)INCLUDE (INSERTNUM INTEGER) VALUES(:CNUM1, 1), (:CNUM2, 2)) InsertedOrders ORDER BY INSERTNUM; - 例 7: C プログラムのステートメントを使用して、DOCUMENTS 表に文書を追加します。
SQL TYPE IS XML AS BLOB_FILE にバインドするホスト変数から文書 ID (DOCID) 列と文書データ (XMLDOC) 列の値を取得します。
EXEC SQL INSERT INTO DOCUMENTS (DOCID, XMLDOC) VALUES (:docid, :xmldoc) - 例 8: この例の INSERT ステートメントでは、表 SALARY_INFO に 3 つの列が定義されて、最後の列は ROW CHANGE TIMESTAMP の暗黙的な隠し列であると想定します。
以下のステートメントでは、暗黙的な隠し列が列リストで明示的に参照され、その値が VALUES 節で提供されます。
以下の INSERT ステートメントは暗黙的な列リストを使用しています。 暗黙的な列リストには暗黙的な隠し列が含まれないため、他の 2 つの列の値だけが VALUES 節に含まれています。INSERT INTO SALARY_INFO (LEVEL, SALARY, UPDATE_TIME) VALUES (2, 30000, CURRENT TIMESTAMP)
この場合、UPDATE_TIME 列はデフォルト値を持つように定義される必要があり、挿入される行にはそのデフォルト値が使用されます。INSERT INTO SALARY_INFO VALUES (2, 30000)
