Hitachi

Hitachi Advanced Data Binder SQLリファレンス


4.2.1 INSERT文の指定形式および規則

表に行を挿入します。値を指定して1つの行を挿入したり,問合せ式本体を使用して1つまたは複数の行を挿入したりすることができます。

〈この項の構成〉

(1) 指定形式

■列単位に挿入値を設定する場合
INSERT文::=INSERT INTO 表名 〔〔AS〕 相関名〕
                {〔(列名〔,列名〕…)〕
                         {問合せ式本体|VALUES(挿入値〔,挿入値〕…)}
                  |DEFAULT VALUES
                 }
 
  挿入値::={値式|NULL|DEFAULT}
■行単位の挿入をする場合
INSERT文::=INSERT INTO 表名 〔〔AS〕 相関名〕 (ROW) VALUES(行挿入値)
 
  行挿入値::=?パラメタ

(2) 指定形式の説明

表名

行を挿入する表(挿入対象表)の表名を指定します。表名の指定規則については,「6.1.5 名前の修飾」の「(2) 表名の指定形式」を参照してください。

指定規則を次に示します。

  • 合せ式本体中に指定した表と同じ表を指定できません。

  • み取り専用ビュー表は指定できません。

  • 配列型の列を定義した表は指定できません。

表名に更新可能ビュー表を指定した場合の留意事項を次に示します。

  • 更新可能ビュー表に行を挿入した場合,基表に行が挿入されます。このとき,ビュー表を定義した際に指定した探索条件に関係なく行を挿入できます。

  • 更新可能ビュー表に行を挿入する際,更新可能ビュー表の列に対応しない基表の列には,列の既定値が格納されます。列の既定値については,「7.10 DEFAULT句」を参照してください。

    なお,DEFAULT句で列の既定値を指定していない場合は,列の既定値としてナル値が格納されます。

重要

更新可能ビュー表の列に対応しない基表の列に,非ナル値制約(ナル値を許さない)が定義されている場合,その列にナル値を格納するような行の挿入はできません。

〔AS〕 相関名

挿入対象表の相関名を指定します。相関名については,「6.1.5 名前の修飾」の「(4) 表指定の指定形式」を参照してください。

(列名〔,列名〕…)

データを挿入する列の列名を指定します。

列名の指定を省略した列には,CREATE TABLE文のDEFAULT句で指定した列の既定値が格納されます。ただし,次の場合は,列の既定値としてナル値が格納されます。

  • CREATE TABLE文のDEFAULT句で列の既定値を指定していない場合

なお,列名を1つも指定しない場合は,CREATE TABLE文で表を定義したときの列の指定順序に従って,すべての列が指定されたと仮定されます。

問合せ式本体

挿入するデータを取り出す問合せ式本体を指定します。問合せ式本体については,「7.1.1 問合せ式の指定形式および規則」の「(2) 指定形式の説明」の「(b) 問合せ式本体」を参照してください。

指定規則を次に示します。

  • 挿入対象表と同じ表を問合せ式本体中に指定できません。

  • 問合せ式本体の選択式の値式には,配列データを指定できません。

VALUES(挿入値〔,挿入値〕…)
挿入値::={値式|NULL|DEFAULT}

列名で指定した各列に対応する挿入値を指定します。挿入値には次のどれかを指定します。

値式

挿入値を値式の形式で指定します。値式については,「7.20 値式」を参照してください。

指定規則を次に示します。

  • 値式中に列指定は指定できません。

  • 挿入対象表と同じ表を挿入値中に指定できません。

NULL:

挿入値をナル値にする場合に指定します。

DEFAULT:

CREATE TABLE文のDEFAULT句で指定した列の既定値を,挿入値にする場合に指定します。DEFAULT句で列の既定値を指定していない場合は,列の既定値としてナル値が仮定されます。

DEFAULT VALUES

挿入対象表のすべての列に対して,列の既定値を挿入する場合に指定します。

DEFAULT VALUESの指定は,次の指定と同じになります。

VALUES(DEFAULT,DEFAULT,…)

上記のDEFAULTの指定数は,挿入対象表の列数と同じになります。

DEFAULT句の指定がない表に対して,DEFAULT VALUESを指定した場合,列の既定値としてナル値が仮定されるため,すべての列にナル値が格納されます。

ROW

行単位でデータを挿入する場合に指定します。ROWを指定すると,行全体を1つのデータとして挿入します。

ROWを指定する場合の規則を次に示します。

  • FIX表に対してだけ指定できます。

  • 問合せ式本体は指定できません。

VALUES(行挿入値)
行挿入値::=?パラメタ

行全体に挿入するデータを指定します。

?パラメタに仮定されるデータ型はCHAR型です。また,データ長は挿入対象表の行長になります。また,構造体中に境界調整による空きがないようにしてください。行長の計算方法については,マニュアルHADB システム構築・運用ガイド行の種別ごとの格納ページ数の求め方の計算式ROWSZを参照してください。

なお,?パラメタは1つだけ指定できます。

(3) 実行時に必要な権限

INSERT文を実行する場合,次に示すすべての権限が必要になります。

(例)
INSERT INTO "T1"
    ("C1","C2","C3")
    SELECT "C1","C2","C3" FROM "T2" WHERE "C3"<=100

上記のINSERT文を実行する場合,表T1に対するINSERT権限と,表T2に対するSELECT権限が必要になります。

(4) 規則

  1. INSERT文中に指定できる表,導出表表関数導出表,および集まり導出表の延べ数は,最大2,048個になります。SQL文中に指定されている表,導出表表関数導出表,および集まり導出表の数え方の規則と例については,「4.4.1 SELECT文の指定形式および規則」の「(4) 規則」を参照してください。

  2. INSERT文中に指定している集合演算がすべてUNIONの場合,指定できる集合演算の数は最大1,023個になります。ただし,指定した集合演算にEXCEPTまたはINTERSECTがある場合は,指定できる集合演算の数は最大63個になります。

  3. INSERT文中に指定できる外結合(FULL OUTER JOIN)の数は,最大63個になります。

  4. 列単位に挿入値を設定する場合,列名と挿入値の指定数を同じにしてください。また,挿入値のデータ型は,データを挿入する列のデータ型か,または変換して代入できるデータ型にする必要があります。変換して代入できるデータ型については,「6.2.2 変換,代入,比較できるデータ型」を参照してください。

    (例)

    INSERT INTO "T1" ("C1","C2","C3")
        VALUES('U00358',5,DATE'2011-09-08')

    この場合,次に示す規則を守る必要があります。

    • 列を3個(C1C2C3)指定しているため,挿入値も3個指定する必要があります。

    • 挿入値のデータ型は,C1C2C3列のデータ型と同じにするか,または変換して代入できるデータ型にする必要があります。例えば,C3列がDATE型の場合,挿入値のデータもDATE型にする必要があります。

  5. 挿入値に?パラメタを指定する場合,仮定されるデータ型およびデータ長は挿入対象列のデータ型およびデータ長になります。

  6. DECIMALNUMERIC型,DOUBLE PRECISION,またはFLOATのデータを,次に示すデータ型の列に挿入する場合,端数(小数)部分が切り捨てられます。

    • INTEGER

    • SMALLINT

    また,DECIMALまたはNUMERICのデータをDECIMALまたはNUMERICの列に挿入する場合,列の位取りより下位の桁部分が切り捨てられます。DOUBLE PRECISIONまたはFLOATのデータをDECIMALまたはNUMERIC型の列に挿入する場合,列の位取りより下位の桁部分が丸められます(最近接偶数への丸め)。

  7. 表定義時に指定した長さ以上の文字データまたはバイナリデータを挿入することはできません。

  8. 列に定義されているデータ型の範囲外の数データを挿入することはできません。

  9. CHAR型の列に挿入するデータが列長より短い場合,左詰めに挿入され,余りの部分に半角空白が設定されます。

  10. BINARY型の列に挿入するデータが列長より短い場合,左詰めに挿入され,余りの部分にX'00'が設定されます。

  11. ディクショナリ表またはシステム表には行を挿入できません。

  12. カラムストア表に対してINSERT文を実行する場合,ローストア表とは異なる運用や設計が必要になります。詳細については,マニュアルHADB システム構築・運用ガイドローストア表とカラムストア表の選択基準シングルチャンク表の再編成が必要かどうかを確認する方法,およびマルチチャンク表の再編成が必要かどうかを確認する方法を参照してください。

(5) 例題

例題1 VALUES指定による行の挿入

販売履歴表(SALESLIST)に次に示すデータ(行)を挿入します。

  • 顧客ID(USERID):U00358

  • 商品コード(PUR-CODE):P003

  • 販売個数(PUR-NUM):5

  • 購入日(PUR-DATE):2011-09-08

INSERT INTO "SALESLIST"
    ("USERID","PUR-CODE","PUR-NUM","PUR-DATE")
    VALUES('U00358','P003',5,DATE'2011-09-08')
例題2 VALUES指定による行の挿入(挿入値に副問合せを指定した場合)

販売履歴表(SALESLIST)に次に示すデータ(行)を挿入します。

  • 商品コード(PUR-CODE):P003

  • 商品名(PUR-NAME):商品表(PRODUCTLIST)の商品コードP003に対応する商品名

  • 商品カラー(PUR-COL):商品表(PRODUCTLIST)の商品コードP003に対応する商品カラー

INSERT INTO "SALESLIST"("PUR-CODE","PUR-NAME","PUR-COL")
    VALUES('P003',
          (SELECT "PUR-NAME" FROM "PRODUCTLIST" WHERE "PUR-CODE"='P003'),
          (SELECT "PUR-COL" FROM "PRODUCTLIST" WHERE "PUR-CODE"='P003'))
例題3 問合せ式本体による行の挿入

販売履歴表(SALESLIST)に,北地区の販売履歴表(SALESLIST_N)のデータを挿入します。

  • 販売履歴表(SALESLIST)と北地区の販売履歴表(SALESLIST_N)の表の列構成は同じとします。

  • 北地区の販売履歴表(SALESLIST_N)の購入日(PUR-DATE_N)が,2011/9/6以降のデータを挿入対象とします。

INSERT INTO "SALESLIST"
    ("USERID","PUR-CODE","PUR-NUM","PUR-DATE")
    SELECT "USERID_N","PUR-CODE_N","PUR-NUM_N","PUR-DATE_N"
        FROM "SALESLIST_N" WHERE "PUR-DATE_N">=DATE'2011-09-06'
例題4 ROW指定による行の挿入

販売履歴表(SALESLIST)に新規の販売情報を追加します(ROW指定で行を挿入します)。販売履歴表の列構成は,顧客ID(USERID),商品コード(PUR-CODE),販売個数(PUR-NUM),購入日(PUR-DATE)です。

INSERT INTO "SALESLIST"(ROW)
    VALUES(?)