4.27.1 INSERT文 形式2の形式と規則
- 〈この項の構成〉
(1) 機能
行全体を一つのデータとみなして,FIX属性の表に,行を行単位で挿入します。直接,値を指定して一つの行の挿入ができます。また,問合せ式本体を使用して,一つ,又は複数の行の挿入もできます。
(2) 使用権限(形式2)
表に対するINSERT権限を持つユーザが,その表に行を挿入できます。
ただし,INSERT文中に問合せ指定を指定する場合は,その問合せ指定の表に対してSELECT権限が必要です。
(3) 形式2<FIX属性の表に,一つの行全体を一つのデータとみなして行単位で行を挿入>
INSERT INTO 〔認可識別子.〕表識別子(ROW) {VALUES(行挿入値) |問合せ式本体 } 〔WITH ROLLBACK〕 〔WRITE IMMEDIATE〕 問合せ式本体::={問合せ指定 |(問合せ式本体) |問合せ式本体{UNION|EXCEPT}〔ALL〕 {問合せ指定|(問合せ式本体)}} 問合せ指定 ::=SELECT〔{ ALL | DISTINCT}〕{選択式〔,選択式〕…|*}表式 表式 ::=FROM 表参照〔,表参照〕… 〔WHERE 探索条件〕 〔GROUP BY 値式〔,値式〕…〕 〔HAVING 探索条件〕
(4) オペランド
ROW及びVALUES以外の説明については,「INSERT文 形式1(行挿入)」を参照してください。
(a) (ROW)
行単位でデータを挿入する場合に指定します。ROWを指定する場合の規則を次に示します。
-
FIX属性の実表に対してだけ指定できます。ROWは行全体(予備列を含む)意味し,これを指定することで行全体を一つのデータとして,一つの領域から挿入します。挿入するデータのデータ型は,各列のデータ型に関係なく,ROW型(ROW型に対しては,CHAR(n)〔nは行長〕に対応する変数,又は同じ長さの構造体を指定できます。ただし,構造体中に境界調整による空きがあってはいけません)にしてください。また,データ長は行長(各列のデータ長の総和)にしてください。
-
UAPが動作するプラットフォームとHiRDBサーバが動作するプラットフォームのエンディアンを同じにしてください。異なるエンディアン間では,ROWは使用できません。例えば,WindowsのUAPでROWを使用する場合は,HiRDBサーバも同じエンディアンのWindows版を使用してください。
(b) {VALUES(行挿入値)|問合せ式本体 }
(c) 問合せ式本体
::={問合せ指定 |(問合せ式本体) |問合せ式本体{UNION|EXCEPT}〔ALL〕 {問合せ指定|(問合せ式本体)}}
挿入するデータを取り出す問合せ式本体を指定します。
問合せ式本体については,「問合せ式」を参照してください。
(5) 留意事項
-
挿入する表の列のデータ型がDECIMAL,又は各国文字列の場合に,対応する部分だけ行挿入値の内容をチェックします。
-
行単位(ROW指定)の検索,又は更新をする場合,ROWに対する埋込み変数,SQL変数,又はSQLパラメタ中の日付データ型の部分は4バイトであり,X’YYYYMMDD’の形式にしてください。行単位(ROW指定)インタフェースを使用し,日付データを既定の文字列表現で受け渡しする場合,列定義時に日付データ型ではなく,CHAR(10)として列を定義してください。さらに,日付演算は,スカラ関数DATEを使用し,日付データ型に変換した後に指定してください。
-
行単位(ROW指定)の検索,又は更新をする場合,ROWに対する埋込み変数,SQL変数,又はSQLパラメタ中の時刻データ型の部分は3バイトであり,X’hhmmss’の形式にしてください。行単位(ROW指定)インタフェースを使用し,時刻データを既定の文字列表現で受け渡しする場合,列定義時に時刻データ型ではなく,CHAR(8)として列を定義してください。さらに,時刻演算は,スカラ関数TIMEを使用し,時刻データ型に変換した後に指定してください。
-
行単位(ROW指定)の検索,又は更新をする場合,ROWに対する埋込み変数,SQL変数,又はSQLパラメタ中の時刻印データ型の部分は,(7+p/2)バイトであり,X’YYYYMMDDhhmmss〔nn…n〕’の形式にしてください。行単位(ROW指定)インタフェースを使用し,時刻印データを既定の文字列表現で受け渡しをする場合,列定義時に時刻印データ型ではなく,長さが19,22,24,又は26バイトのCHARとして列を定義してください。
-
挿入する表の列にSYSTEM GENERATEDを指定している場合,対応する部分のデータは無視され,DATE型の場合は現在の日付(CURRENT_DATE),TIME型の場合は現在の時刻(CURRENT_TIME)を挿入します。
-
挿入する表に予備列が定義されている場合,対応する部分のデータは無視され,予備列の定義長分の0x00を挿入します。
(6) 共通規則
-
SELECT文を指定した場合の共通規則は,「INSERT文 形式1(行挿入)」の共通規則を参照してください。
-
WITHOUT ROLLBACKを指定した表に対して,INSERT文を実行する場合,インデクスの定義有無によって行排他の解除タイミングが異なります。詳細は「CREATE TABLE(表定義)」のWITHOUT ROLLBACKの規則を参照してください。
-
共用表にデータを挿入する場合,事前にその表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表にデータ挿入した場合,エラーとなります。共用表に対する更新については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文(表の排他制御)」の留意事項を参照してください。
-
挿入する表に既定文字集合以外の文字データ型の列が存在する場合,行単位のデータ挿入はできません。
(7) 参照制約に関する規則
-
SELECT文を指定した場合の参照制約に関する規則は,「INSERT文 形式1(行挿入)」の参照制約に関する規則を参照してください。
-
参照表に行を挿入する場合,外部キー構成列の値が被参照表の主キー構成列の値に含まれるかどうかを確認するため,被参照表を検索します。このとき,被参照表の検索時のデータ保証レベルは共用モードになります。そのため,参照表への行の挿入時,ほかのトランザクションによって被参照表に対する操作が行われている場合は,そのトランザクションが決着されるまで参照表への行の挿入は待ち状態になります。
(8) 使用例
在庫表(ZAIKO)に埋込み変数(XROW)に読み込まれた1行分の値をまとめて挿入します。
INSERT INTO ZAIKO(ROW) VALUES(:XROW)