INSERT ステートメント

INSERT ステートメントは、 表、ニックネーム、またはビュー、あるいは指定された全選択の基礎になる表、 ニックネーム、またはビューに、行を挿入します。

行をニックネームに挿入することは、 その行をそのニックネームが参照するデータ・ソース・オブジェクトに挿入することでもあります。 このビューに対する挿入操作用に INSTEAD OF トリガーが定義されていない場合、 行をビューに挿入することは、その行をそのビューの基本となる表に挿入することでもあります。 このようなトリガーが定義されている場合は、トリガーが代わりに実行されます。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 このステートメントは、動的に作成できる実行可能ステートメントです。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • ターゲット表、ビュー、またはニックネームに対する INSERT 特権
  • ターゲット表、ビュー、またはニックネームに対する CONTROL 特権
  • ターゲットとなる表、ビュー、またはニックネームが含まれるスキーマに対する INSERTIN 特権
  • ターゲット表、ビュー、またはニックネームが含まれるスキーマに対する DATAACCESS 権限
  • DATAACCESS 権限
さらに、ステートメントの許可 ID には、INSERT ステートメントで使用する全選択で参照される表、ビュー、またはニックネームのそれぞれに対して、以下の権限の少なくとも 1 つが含まれている必要があります。
  • SELECT 特権
  • CONTROL 特権
  • 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
  • 表、ビュー、またはニックネームが含まれるスキーマに対する DATAACCESS 権限
  • DATAACCESS 権限

静的 INSERT ステートメントの場合、GROUP 特権はチェックされません。

挿入操作の対象がニックネームの場合は、データ・ソースでステートメントが実行されないうちは、 そのデータ・ソース上のオブジェクトに対する特権は考慮されません。 この時点で、データ・ソースに接続するために使用される許可 ID は、 データ・ソースのオブジェクトに対して操作を行うのに必要な特権を持っている必要があります。 ステートメントの許可 ID は、データ・ソースの別の許可 ID へマップできます。

構文

Read syntax diagramSkip visual syntax diagramINSERT INTOtable-nameview-namenickname(WITH,common-table-expressionfullselect)(,column-name)include-columnsVALUES,expressionNULLDEFAULT(,expressionNULLDEFAULT)row-expressionWITH,common-table-expressionfullselectWITHRRRSCSUR
include-columns
Read syntax diagramSkip visual syntax diagramINCLUDE( ,column-namedata-type )

説明

INTO table-nameview-namenickname、または (fullselect)
挿入操作の対象のオブジェクトを指定します。 名前は、以下のいずれかのオブジェクトを示すものでなければなりません。
  • アプリケーション・サーバーに存在する表、ビュー、またはニックネーム
  • remote-object-name を使用して指定されたリモート・サーバーにある表またはビュー
オブジェクトは、INSTEAD OF トリガーがサブジェクト・ビューに対する挿入操作用に定義されていない限り、カタログ表、システム保守マテリアライズ照会表、カタログ表のビュー、読み取り専用ビューであってはなりません。 行をニックネームに挿入することは、 その行をそのニックネームが参照するデータ・ソース・オブジェクトに挿入することでもあります。

挿入操作のオブジェクトが全選択の場合、全選択は、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-nameview-name などの列と一緒に INSERT ステートメントの中間結果表に組み込まれている列セットを指定します。 include-columns は、 table-nameview-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 には、トピック『Expressions』で定義されている式を指定できます。 expression が行タイプの場合、括弧内に入れないでください。 expression が変数である場合は、拡張標識変数を使用できる標識変数 (またはホスト構造の場合は標識配列) をホスト変数に組み込むことができます。 拡張標識変数が使用可能であり、以下の内容のいずれかが該当する場合は、デフォルト (-5) または未割り当て (-7) の拡張標識変数の値は使用できません (SQLSTATE 22539)。
  • 式が明示的キャストによる単一ホスト変数より複雑な場合
  • ターゲット列のデータ・タイプが構造化タイプである
ヌル
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 ステートメントをパススルーします。
行式
列名が含まれていない、『行式』で記述されているタイプの行式を指定します。 この行内のフィールド数は挿入のターゲットと一致しなければならず、各フィールドは対応する列に割り当て可能でなければなりません。
WITH 共通表式 (common-table-expression)
後続の fullselect で使用する共通表式を定義します。
全選択
新しい行の集合を、全選択の結果表の形式で指定します。 行の数は、1 つか、複数か、またはゼロのいずれかです。 結果表が空の場合、SQLCODE は +100 に設定され、 SQLSTATE は '02000' に設定されます。

INSERT の基本オブジェクトおよび全選択の基本オブジェクトまたは全選択の副照会のいずれかが同一の表である場合、 行挿入の前に、全選択が完全に評価されます。

結果表の列の数は、列リストの名前の数と同じでなければなりません。 結果の最初の列の値はリストの最初の列に挿入され、 2 番目の値は 2 番目の列に挿入されます。 以下同様です。

結果列の値を指定する式が変数の場合は、拡張標識変数を使用できる標識変数をホスト変数に組み込めます。 拡張標識変数が使用可能であり、expression が複数のホスト変数で成っているか、またはホスト変数が明示的にキャストされている場合は、デフォルトまたは未割り当ての拡張標識変数の値は使用できません (SQLSTATE 22539)。 デフォルトまたは未割り当ての値の効果は、fullselect の対応するターゲット列に適用されます。

WITH
ステートメントが実行される分離レベルを指定します。
RR
反復可能読み取り
RS
読み取り固定
CS
カーソル固定
UR
非コミット読み取り
ステートメントのデフォルト分離レベルは、ステートメントがバインドされている パッケージの分離レベルです。 WITH 節はニックネームには影響を与えません。ニックネームは常にステートメントのデフォルトの分離レベルを使用します。

ルール

  • トリガー: 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)。

  • INSERT ステートメントの実行後、SQLCA の SQLERRD の 3 番目の変数 (SQLERRD(3)) の値は、 挿入操作に渡された行の数を示します。 SQL プロシージャー・ステートメントでは、 値は GET DIAGNOSTICS ステートメントの ROW_COUNT 変数を使用して検索できます。 SQLERRD(5) には、トリガーによって実行された挿入、更新、および削除操作の数が入られます。
  • 適切なロックが既に存在していない限り、正常な INSERT ステートメントの実行時に 1 つ以上の排他ロックが獲得されます。 それらのロックが解放されるまで、挿入された行は以下によってのみアクセス可能です。
    • その挿入を行ったアプリケーション・プロセス
    • 読み取り専用カーソル、SELECT INTO ステートメント、 または副照会で使用されている副選択を介して分離レベル UR を使用する他のアプリケーション・プロセス
  • ロッキングについての詳細は、COMMIT、ROLLBACK、 および LOCK TABLE のステートメントの説明を参照してください。
  • パーティション・データベースに対してアプリケーションが実行されており、 INSERT BUF オプションを指定してアプリケーションがバインドされている場合、 EXECUTE IMMEDIATE を使用して処理されない VALUES を伴う INSERT はバッファーに入れられます。 このような INSERT ステートメントは、アプリケーションのロジックのループ内で処理されていると想定されます。 ステートメントをその完了まで実行する代わりに、 Db2 は新しい行の値を 1 つまたは複数のバッファーに入れることを試みます。 結果として、表への行の実際の挿入は、アプリケーションの INSERT ロジックとは非同期に、後で実行されます。 この非同期の挿入が原因で、 アプリケーションでその INSERT に続く他の SQL ステートメントに INSERT が戻されることに関連してエラーが生じる場合がある点に注意してください。

    これにより、INSERT のパフォーマンスが劇的に向上する可能性がありますが、エラー処理の非同期の性質のため、クリーン・データで使用することをお勧めします。

  • ID 列を持つ表に行が挿入されると、ID 列の値が生成されます。
    • GENERATED ALWAYS ID 列の場合、値は常に生成されます。
    • GENERATED BY DEFAULT 列に対しては、値が (VALUES 節や副選択によって) 明示的に指定されていなければ、値が生成されます。
    最初に生成される値は、ID 列に対して START WITH で指定された値です。
  • ユーザー定義の特殊タイプ ID 列に値が挿入されると、その値が実際に列に割り当てられる前に、ソース・タイプで計算全体が行われ、結果が特殊タイプにキャストされます。 (計算に先立って、元の値がソース・タイプにキャストされることはありません。)
  • GENERATED ALWAYS の ID 列に挿入するときは、その列の値が常に生成されます。挿入の際にユーザーが値を指定することはできません。 列のリストに GENERATED ALWAYS という ID 列がリストされている INSERT ステートメントで、 VALUES 節に DEFAULT 以外の値が指定された場合は、エラーが発生します (SQLSTATE 428C9)。
    例えば、EMPID という列が GENERATED ALWAYS の ID 列として定義されているとします。 そこで、次のコマンドを入力します。
       INSERT INTO T2 (EMPID, EMPNAME, EMPADDR)
         VALUES (:hv_valid_emp_id, :hv_name, :hv_addr) 
    すると、エラーが戻されます。
  • GENERATED ALWAYS ROW CHANGE TIMESTAMP 列に挿入する場合、その列には常に値が生成され、ユーザーは挿入時に値を指定してはなりません (SQLSTATE 428C9)。 生成される値は、データベース・パーティション上の挿入される行ごとに固有です。
  • GENERATED BY DEFAULT 列に挿入するときは、VALUES 節で、または副選択から、その列の実際の値を指定できます。 ただし、VALUES 節に値を指定するとき、データベース・マネージャーは指定された値を一切検査しません。 IDENTITY 列の値を固有にするには、ID 列に対するユニーク索引を作成する必要があります。
    列リストを指定せずに、GENERATED BY DEFAULT ID 列を持つ表に挿入する場合、VALUES 節は、ID 列の値を表す DEFAULT キーワードを指定することができます。 このような場合、ID 列の値が生成されます。
       INSERT INTO T2 (EMPID, EMPNAME, EMPADDR)
         VALUES (DEFAULT, :hv_name, :hv_addr)
    この例では、EMPID が ID 列として定義され、この列に挿入される値はデータベース・マネージャーによって生成されます。
  • 副選択を使用して ID 列に挿入する場合の規則は、VALUES 文節を使用して挿入する場合の規則と似ています。 ID 列の値は、ID 列が GENERATED BY DEFAULT として定義されている場合にのみ指定できます。
    例えば、同じ定義を持つ、T1 と T2 という 2 つの表があるとします。 これらの表にはいずれも列 intcol1 および identcol2 (これらはどちらもタイプ INTEGER の列で、 2 番目の列には識別属性がある) が含まれています。 次のような挿入について考慮します。
       INSERT INTO T2
         SELECT *
         FROM T1
    この例は、以下と論理的に同等です。
       INSERT INTO T2 (intcol1,identcol2)
         SELECT intcol1, identcol2
         FROM T1
    このどちらの場合においても、 INSERT ステートメントには T2 の ID 列を表す明示的な値が指定されています。 このように明示的な値を指定した場合は、ID 列の値を指定することができます。 しかしこれは、T2 の ID 列が GENERATED BY DEFAULT として定義されている場合に限られます。 それ以外の場合は、ID 列に値を指定するとエラーが戻されます (SQLSTATE 428C9)。
    表に GENERATED ALWAYS の ID 列として定義された列がある場合でも、 同じ定義を持つ表から、他のすべての列に伝搬することができます。 例えば、前出の例示表 T1 と T2 であれば、以下の SQL によって T1 から T2 に intcol1 の値を伝搬することができます。
       INSERT INTO T2 (intcol1)
         SELECT intcol1
         FROM T1
    なお、identcol2 は列のリストで指定されていないため、 この列にはデフォルトの (生成) 値が使用されます。
  • GENERATED ALWAYS の ID 列または ROW CHANGE TIMESTAMP 列として定義された単一列の表に行を挿入するときは、VALUES 節に DEFAULT キーワードを指定することができます。 この場合、表の値はアプリケーションによって提供されません。ID 列または ROW CHANGE TIMESTAMP 列の値はデータベース・マネージャーによって生成されます。
       INSERT INTO IDTABLE
         VALUES(DEFAULT)
    識別属性を持つ列が含まれているこの同じ単一列の表に、 1 つの INSERT ステートメントを使用して複数の行を挿入するとします。 その場合は、次のような INSERT ステートメントを使用できます。
       INSERT INTO IDTABLE
         VALUES (DEFAULT), (DEFAULT), (DEFAULT), (DEFAULT)
  • ID 列の値が生成されると、生成されたその値が使用されます。次に値が必要になったときは、新しい値が生成されます。 これは、ID 列に関連した INSERT ステートメントが失敗した場合やロールバックされた場合も同様です。

    例えば、ID 列にユニーク索引が作成されていると想定します。 ID 列に対する値の生成で重複キーの違反が検出されると、エラーが戻され (SQLSTATE 23505)、 その ID 列に対して生成される値は破棄されることになります。 このエラーが生じる可能性があるのは、ID 列が GENERATED BY DEFAULT として定義されており、 システムが新しい値を生成しようとしたものの、 ユーザーが以前の INSERT ステートメントで ID 列に明示的な値を指定していた場合です。 このような場合は、同じ INSERT ステートメントをもう一度発行すればうまくいきます。 ID 列に対して次の値が生成されます。この値が固有の値になってこの INSERT ステートメントが正常に完了する可能性があります。

  • ID 列に対して生成される値が ID 列の最大値 (降順で値が生成される場合は最小値) を超えると、 エラーが発生します (SQLSTATE 23522)。 この場合、ユーザーは、表を DROP して、より広い範囲を持つ ID 列 (より広い値の範囲で、 列のデータ・タイプを変更したり、値を増分したりできるようにするため) を指定して、 新しい表の CREATE を実行する必要があります。

    例えば、データ・タイプ SMALLINT で定義されている ID 列があり、 この列で割り当てられる値を使い切ってしまったとします。 ID の列を INTEGER として再定義するには、データをアンロードし、表をドロップし、 新しい定義の列で表を再作成して、それからデータを再ロードしなければなりません。 そして、表を再定義する際は、生成される次の値が元の順序で次の値になるように、ID 列の START WITH 値を指定する必要があります。 最後の値を確認するには、データをアンロードする前に、ID 列 の MAX (昇順で値を生成している場合) または MIN (降順で値を生成している場合) を使用して照会を発行します。

  • 拡張標識変数および挿入トリガー: 拡張標識変数の使用によって、挿入トリガーのアクティブ化において変更が生じることはありません。 暗黙的または明示的な列リスト内のすべての列が、未割り当てまたはデフォルトの拡張標識変数ベースの値に割り当てられている場合は、すべての列にそれぞれデフォルト値がある挿入が試行され、正常に実行された場合は、挿入トリガーがアクティブ化されます。
  • 拡張標識変数と据え置きエラー・チェック: 更新不能列への挿入を認識するための妥当性検査は、拡張標識変数が使用可能でない場合にはステートメントの準備中に行われますが、拡張標識変数が使用可能な場合はステートメントの実行まで据え置かれます。 エラーを報告する必要があるかどうかは、実行時のみ判別できます。
  • 行開始列、行終了列、またはトランザクション開始 ID 列を持つ表への挿入: これらの生成列を持つ表 (例えば、システム期間テンポラル表) に行を挿入するとき、データベース・マネージャーは以下の列に値を割り当てます。
    • 行開始列に割り当てられる値は、次のいずれかの場合に時刻機構を読み取ることによって生成されます。(1) トランザクションの中で、表に含まれる行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるようなデータ変更ステートメントを最初に実行するとき。(2) システム期間テンポラル表に含まれる行を削除するとき。 行開始列の値は、トランザクション全体にわたり固有になるようにデータベース・マネージャーによって生成されます。 単一の SQL トランザクション内で複数の行が挿入される場合、行開始列の値はすべての行において同じになり、別のトランザクションでその列のために生成された値とは異なる固有の値になります。
    • 行終了列には、この列のデータ・タイプ (9999-12-30-00.00.00.000000000000) の最大値が割り当てられます。
    • トランザクション開始 ID 列には、トランザクションごとに固有のタイム・スタンプ値、または NULL 値が割り当てられます。 トランザクション開始 ID 列が NULL 可能である場合には、この列に NULL 値が割り当てられます。 それ以外の場合、この値は、次のいずれかの場合に時刻機構を読み取ることによって生成されます。(1) トランザクションの中で、表に含まれる行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるようなデータ変更ステートメントを最初に実行するとき。(2) システム期間テンポラル表に含まれる行を削除するとき。 単一の SQL トランザクション内で複数の行が挿入される場合、トランザクション開始 ID 列の値はすべての行において同じになり、別のトランザクションでその列のために生成された値とは異なる固有の値になります。
  • システム期間テンポラル表への挿入: システム期間テンポラル表に行を挿入するとき、データベース・マネージャーは、行開始列、行終了列、またはトランザクション開始 ID 列を持つ表に対する指示に従って列に値を割り当てます。 また、行を挿入するとき、そのシステム期間テンポラル表に関連付けられた履歴表に行は追加されません。
  • アプリケーション期間テンポラル表への挿入: 行がアプリケーション期間テンポラル表に挿入され、以下の条件を満たす場合には、エラーが戻ります。
    • アプリケーション期間テンポラル表に、BUSINESS_TIME WITHOUT OVERLAPS 節が定義された主キー制約またはユニーク制約、あるいは BUSINESS_TIME WITHOUT OVERLAPS 節が定義されたユニーク索引がある。
    • BUSINESS_TIME 期間の開始列と終了列で定義された期間が、同じユニーク制約またはユニーク索引の他の列と一致する別の行の BUSINESS_TIME 期間の開始列および終了列で定義された期間とオーバーラップする。
  • 列リストを使用しない INSERT の考慮事項: 列リストを使用しない INSERT ステートメントには、暗黙的な非表示列は含まれません。 暗黙的に非表示として定義され、かつ NULL ではない列は、定義済みのデフォルト値を持つ必要があります。

  • 例 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 INTO SALARY_INFO (LEVEL, SALARY, UPDATE_TIME)
         VALUES (2, 30000, CURRENT TIMESTAMP)
    次の INSERT ステートメントは暗黙的な列リストを使用します。 暗黙的な列リストには暗黙的な隠し列が含まれないため、他の 2 つの列の値だけが VALUES 節に含まれています。
       INSERT INTO SALARY_INFO VALUES (2, 30000)
    この場合、UPDATE_TIME 列はデフォルト値を持つように定義される必要があり、挿入される行にはそのデフォルト値が使用されます。