INSERT ステートメント¶
INSERT ステートメントは、ビューに 1 つまたは複数のタプルを挿入し、基盤となるデータソースを更新します。
INSERT INTO <view identifier> ( <field name> [, <field name> ]* )
VALUES ( <value> [, <value> ]* )
[ RETURNING <field name> [ , <field name> ]* ]
[ CONTEXT ( <context information> [, <context information> ]* ) ]
[ TRACE ]
INSERT INTO <view identifier>
VALUES ( <value> [, <value> ]* )
[ RETURNING <field name> [, <field name> ]* ]
[ CONTEXT ( <context information> [, <context information> ]* ) ]
[ TRACE ]
INSERT INTO <view identifier> [ ( <field name> [, <field name> ]* ) ]
[ RETURNING <field name> [, <field name>]* ]
VALUES ( <value> [, <value> ]* ) [, ( <value> [, <value> ]* ) ]*
[ TRACE ]
INSERT INTO <view identifier>
SET <field name> = <value> [, <field name> = <value> ]*
[ RETURNING <field name> [, <field name>]* ]
[ CONTEXT ( <context information> [, <context information> ]* ) ]
[ TRACE ]
INSERT INTO { <view identifier> | <identifier of a base view of a remote table>
| <materialized table identifier> | <temporary table identifier> }
{ ON DUPLICATE KEY UPDATE |
ON DUPLICATE KEY ( <field name> [, <field name>]* ) UPDATE }
[ OPTIONS ( <option information> [ , <option information> ]* ) ]
<select query>
[ CONTEXT ( <context information> [, <context information> ]* ) ]
[ TRACE ]
<field name> ::=
<identifier>[.<identifier>]
<value> ::=
NULL
| <number>
| <boolean>
| <literal>
| <function>
<view identifier> ::= (「 VQL ステートメントの基本エレメント 」を参照)
<identifier of a base view of a remote table> ::= CREATE_REMOTE_TABLE プロシージャまたは Create Remote Table フォームで作成された基本ビュー。
<materialized table identifier> ::= (「 Materialized Tables 」を参照)
<temporary table identifier> ::= (「 Temporary Tables 」を参照)
<option information> := 挿入を設定するためのオプションのパラメータ。使用できるオプションの詳細については、「 CREATE REMOTE TABLE コマンド 」を参照してください。
INSERT INTO view <SELECT QUERY>
このコマンドは、以下の手順を実行します。
ターゲットビューが存在するデータソースに選択クエリを委任できる場合 (直接読み込みが可能)、VDP はターゲットデータソースで
INSERT INTO table <SELECT QUERY>
コマンドを実行します。選択クエリを委任できない場合:
VDP サーバーで選択クエリを実行します。
前の手順で実行したクエリで取得した行をビューに挿入します。
このコマンドを実行するには、以下の権限が必要です。
ビューに対する
Insert
。選択クエリで参照されるビューに対する
Execute
。
INSERT INTO view ON DUPLICATE KEY UPDATE <SELECT QUERY>
このコマンドは、以下の手順を実行します。
ターゲットビューが存在するデータソースに選択クエリを委任できる場合 (直接読み込みが可能)、VDP はターゲットデータソースで
MERGE INTO table <SELECT QUERY>
コマンドを実行します。このコマンドは、選択クエリの結果をターゲットテーブルにマージします。選択クエリを委任できない場合:
キャッシュデータソースに一時テーブルを作成し、選択したクエリの結果を挿入します。
UPSERT とも呼ばれるターゲットテーブルに一時テーブルをマージします。
一時テーブルを削除します。
このキャッシュロード方法をサポートするには、ビューは以下の要件を満たす必要があります。
ターゲットビューにプライマリキーが必要です。
このビューに、行が追加または更新された日時を示す列が 1 つまたは複数必要です。
Virtual DataPort は、各行が追加または更新された日時を示すフィールドに対する条件をソースにプッシュダウンできる 必要があります 。
ソースでデータから行を削除することはできません。実行できるのは、行の追加または更新だけです。ソースで行が削除された場合、このビューのキャッシュを無効化して再度キャッシュしない限り、ビューは削除された行を返します。行は実際には削除されず、削除済みまたは無効としてマークされるだけなので、この要件は多くのシナリオで満たされます。
このコマンドをサポートするデータソースのリストを取得するには、「 マージデータをサポートするデータソース 」のセクションを参照してください。
このコマンドを実行するには、以下の要件が必要です。
MySQL と PostgreSQL: キーは、ビューのプライマリキーまたは一意のインデックスでなければなりません。
MySQL: VDP は、テーブルに複数の一意の制限がある場合、エラーを表示します。MySQL では、一意のインデックスが複数あるテーブルで
ON DUPLICATE KEY UPDATE
句を使用しないことをお勧めします。詳細については、 情報 を参照してください。Teradata: VDP がデータを挿入しようとするターゲットテーブルには、 プライマリインデックス が必要です。これがないと、INSERT コマンドは失敗します。ストアドプロシージャ CREATE_REMOTE_TABLE は、可能であれば Teradata でプライマリインデックスを作成します。詳細については、ストアドプロシージャのドキュメントを参照してください。プライマリインデックスなしで作成されたテーブルに対して
INSERT INTO view ON DUPLICATE KEY UPDATE
コマンドを実行しようとすると、以下のエラーが表示されます。
An invalid statement was attempted on a table without a primary index: Merge-Into NoPI tables is not allowed.
例 :
ビュー internet_inc への行の追加
INSERT INTO internet_inc (iinc_id, summary, taxid, specific_field1, specific_field2)
VALUES (6, 'Error in ADSL Router', 'B78596015', '5', '6')
行は、ソースデータベース内で internet_inc
ビューに関連付けられたテーブルに追加されます。
ビュー internet_inc へ行を追加するための代替構文
INSERT INTO internet_inc
SET
iinc_id = 6
, summary = 'Error in ADSL router'
, taxid = 'B78596015'
, specific_field1 = '5'
, specific_field2 = '6'
1 つのビューへの複数行の追加
INSERT INTO employee (last_name, first_name, title) VALUES
('Callahan', 'Laura', 'IT Staff')
, ('Edwards', 'Nancy', 'Sales Manager')
, ('King', 'Robert', 'IT Staff');
選択クエリを使用した挿入
INSERT INTO all_sales
SELECT * FROM online_sales
WHERE year = getyear(CURRENT_DATE());
選択クエリを使用した挿入と更新
INSERT INTO all_sales ON DUPLICATE KEY(sale_id) UPDATE
SELECT * FROM online_sales
WHERE modification_date > '@LAST_REFRESH_DATE';
このコマンドは、 all_sales
ビューに最後に挿入されてから、新規作成および変更されたオンラインセールスを挿入および更新します。 modification_date
フィールドには、行が挿入または変更されたときのタイムスタンプが含まれます。クエリの実行中、変数 @LAST_REFRESH_DATE
は、ビュー all_sales
にデータを挿入するクエリが最後に実行されて正常に終了したときのタイムスタンプに置き換えられます。このコマンドは sale_id
フィールドを使用して、行がすでにキャッシュされているかどうかを判断します。このフィールドの値が同じであれば、キャッシュの行とソースの行は同じと見なされます。コマンドで明示的に比較フィールドを設定しない場合、ビューのプライマリキーを使用します。
バイナリデータの挿入
INSERT INTO files(file) values ('FFD8FFDB00430003020202020203020202030303030406040404040408060605060
9080A0A090809090A0C0F0C0A0B0E0B09090D110D0E0F101011100A0C12131210130F101010FFC9000B080001000101011100FFCC000
600101005FFDA0008010100003F00D2CF20FFD9');
バイナリデータを 16 進数にエンコードします。バイナリデータの挿入は、基盤となるデータベースがOracle、SQLServer、MySQL、PostgreSQL、および Teradata のいずれかである場合に機能します。