INSERT ステートメントを使用した行の挿入
単一行または複数行を表またはビューに追加するには、INSERT ステートメントの形式を使用してください。
次のいずれかの方法で、INSERT ステートメントを使用して表またはビューに新規の行を追加することができます。
- 追加される列について、INSERT ステートメントで値を指定する。
- INSERT ステートメントに選択ステートメントを組み込んで、別の表またはビュー内のどのデータを新しい行に入れるかを SQL に指示する。
- INSERT ステートメントのブロック化形式を指定して、複数の行を追加する。
挿入する各行について、NOT NULL 属性が定義されている各列に値を提供しなければなりません (その列にデフォルト値がない場合)。表またはビューに行を追加するための INSERT ステートメントは、次のようになります。
INSERT INTO 表名
(列 1, 列 2, ... )
VALUES (列 1 の値, 列 2 の値, ... )
INTO 文節には、値を指定する列の名前を指定します。 VALUES 文節には、INTO 文節に指定した各列の値を指定します。 値には、次のいずれかを指定できます。
- 定数。 VALUES 文節で提供される値を挿入します。
- ヌル値。 キーワード NULL を使用して、ヌル値を挿入します。列は、ヌル値可能として定義されていなければなりません。そうしなければ、エラーが発生します。
- ホスト変数。 ホスト変数の内容を挿入します。
- グローバル変数。 グローバル変数の内容を挿入します。
- 特殊レジスター。 特殊レジスター値、例えば USER を挿入します。
- 式。 式から得られた値を挿入します。
- スカラー全選択。実行中の select ステートメントの結果の値を挿入します。
- DEFAULT キーワード。列のデフォルト値を挿入します。 列は、その列用に定義されたデフォルト値を持つか、またはヌル値可能でなければなりません。 そうでなければ、エラーが発生します。
INSERT ステートメントの列リストに名前を指定した各列について、VALUES 文節で値を指定しなければなりません。表内のすべての列が、VALUES 文節で指定する値を持つ場合には、列名リストを省略することができます。 ある列にデフォルト値が入る場合には、VALUES 文節内の値としてキーワード DEFAULT を使用することができます。 これにより、その列にデフォルト値が入れられます。
値を挿入しようとするすべての列の名前を指定することをお勧めします。理由は以下のとおりです。
- INSERT ステートメントが分かりやすくなる。
- 列名に基づいた正しい順序で値を指定していることを確認できる。
- データの独立性が高まる。表内で列が定義されている順序は、INSERT ステートメントには影響しません。
列がヌル値を認めるか、またはデフォルト値を持つように定義されている場合は、列名リストでその名前を指定したり、その値を指定したりする必要はありません。この場合は、デフォルト値が使用されます。列がデフォルト値を持つように定義されている場合は、列にデフォルト値が入ります。明示のデフォルト値を持たない列定義について DEFAULT が指定されると、SQL はそのデータ・タイプについてのデフォルト値を列に入れます。 列用に定義されたデフォルト値がないが、その列がヌル値を認めるように定義されている (列定義で NOT NULL が指定されていない) 場合には、SQL はその列にヌル値を入れます。
- 数値列の場合、デフォルト値は 0 です。
- 固定長文字またはグラフィック列の場合、デフォルト値はブランクです。
- 固定長バイナリー列の場合、デフォルトは 16 進数のゼロです。
- 可変長文字、グラフィック列、バイナリー列の場合、または LOB 列の場合、デフォルトは長さがゼロのストリングです。
- 日付、時刻、およびタイム・スタンプ列の場合、デフォルト値は現在の日付、時刻、またはタイム・スタンプです。 レコードのブロックが挿入される場合には、デフォルト値の日付/時刻値はブロックの書き込み時にシステムから取り出されます。 これは、ブロック内の各行でこの列に同じデフォルト値が割り当てられることを意味します。
- データ・リンク列の場合、デフォルト値は DLVALUE('','URL','') に対応する値になります。
- 特殊タイプ列の場合、デフォルト値は対応するソース・タイプのデフォルト値になります。
- ROWID 列、または AS IDENTITY で定義された列の場合、データベース・マネージャーがデフォルト値を生成します。
- XML 列では、NULL 値以外に許可されるデフォルトはありません。
表内の既存の行と重複する行をプログラムが挿入しようとすると、エラーが起こることがあります。 複数のヌル値は、索引の作成時に使用されたオプションによって、重複する値と見なされる場合と見なされない場合があります。
- 表が基本キー、固有キー、または固有索引を備えているときは、その行は挿入されません。その代わりに、SQL から SQLCODE -803 が戻されます。
- 表が基本キー、固有キー、または固有索引を備えていないときは、その行は正常に挿入され、エラーは起こりません。
SQL が INSERT ステートメントの実行中にエラーを検出すると、データの挿入を中止します。 COMMIT(*ALL)、COMMIT(*CS)、COMMIT(*CHG)、または COMMIT(*RR) が指定されていると、行の挿入は行われません。選択ステートメントを伴う INSERT またはブロック化挿入の場合、このステートメントによってすでに挿入されている行は削除されます。COMMIT(*NONE) が指定されている場合は、すでに挿入された行があっても、削除されません。
SQL によって作成される表は、*YES の削除済みレコード再利用パラメーターを用いて作成されます。 これにより、データベース・マネージャーは、表内の削除済みとしてマークされた行を再利用することができます。CHGPF コマンドを使用すると、属性を *NO に変更できます。これを行うと、INSERT では常に表の終わりに行が追加されるようになります。
行を挿入した順序で、それらの行が取り出されるとは限りません。
行がエラーなしで挿入されると、SQLCA の SQLERRD(3) フィールドに 1 が入ります。