1 つのロー (構文 1) またはデータベースのある場所から選択したロー (構文 2) をテーブルに挿入します。
INSERT [ INTO ] [ owner.]table-name [ ( column-name, ... ) ] [ ON EXISTING { ERROR | SKIP | UPDATE [ DEFAULTS { ON | OFF } ] } ] { DEFAULT VALUES | VALUES row-value-constructor } [ OPTION( query-hint [, ... ] ) ]
INSERT [ INTO ] [ owner.]table-name [ ( [ column-name [, ... ] ] ) ] [ ON EXISTING { ERROR | SKIP | UPDATE [ DEFAULTS { ON | OFF } ] } ] [ WITH AUTO NAME ] select-statement [ OPTION( query-hint[, ... ] ) ]
query-hint : MATERIALIZED VIEW OPTIMIZATION option-value | FORCE OPTIMIZATION | FORCE NO OPTIMIZATION | option-name = option-value
option-name : identifier
option-value : hostvar (許可されたインジケータ) | string | identifier | number
insert-expression :
expression | DEFAULT
row-value-constructor : ( [ insert-expression [, ... ] ] ) [, [ insert-expression [, ... ] ] ) ... ]
VALUES 句 VALUES 句は、挿入する値を指定するときに使用します。対象となるカラムに定義されているデフォルト値を挿入する場合は、DEFAULT VALUES を指定します。VALUES () と指定しても DEFAULT VALUES と同義になります。また、VALUES 句では、1 つの文に複数のローの値を挿入できるように、ロー値コンストラクタがサポートされています。各 row-value-constructor 内の insert-expression 値の数と順序は、INTO 句で指定したカラムリストに対応させてください。カラムリストを指定していない場合は、テーブルの完全な順序のカラムリストであると見なされます。空のカラムリスト () を指定する場合は、テーブルの各カラムにデフォルト値が含まれている必要があります。複数のロー値コンストラクタを指定する場合は、カンマで区切る必要があります。
ローの挿入時にエラーが発生すると、すべての変更がロールバックされます。
WITH AUTO NAME 句 WITH AUTO NAME は、構文 2 にのみ適用されます。WITH AUTO NAME を指定すると、クエリブロックの項目名によってデータの所属カラムが決まります。クエリブロックの項目には、カラム参照かエイリアスの式を指定してください。クエリブロックで定義されていない送信先カラムには、デフォルト値が割り当てられます。これは送信先テーブルのカラム数が多い場合に役立ちます。
WITH AUTO NAME 句を指定し、ターゲットテーブルのカラムと一致しないカラムがクエリブロックに含まれている場合、INSERT 文はエラーを返します。たとえば、次の文を実行すると、テーブルで SELECT ブロックの操作カラムを見つけることができないことを示すエラーが返されます。
CREATE TABLE MyTable5( pk INT PRIMARY KEY DEFAULT AUTOINCREMENT, TableName CHAR(128), TableNameLen INT ); INSERT INTO MyTable5 WITH AUTO NAME SELECT length(t.table_name) AS TableNameLen, t.table_name AS TableName, 1 as operation FROM SYS.SYSTAB t WHERE table_id <= 10; |
ON EXISTING 句 INSERT 文の ON EXISTING 句は、両方の構文に適用されます。ON EXISTING 句は、プライマリキールックアップに基づいて、新しいカラム値でテーブルの既存のローを更新します。この句は、プライマリキーが設定されたテーブルでのみ使用できます。プライマリキーがないテーブルでこの句を使用すると、構文エラーになります。ON EXISTING を指定してプロキシテーブルに値を挿入することはできません。
ON EXISTING 条件を満たすローが数多く存在する可能性がある場合は、代わりに MERGE 文を使用してください。MERGE 文を使用すると、一致するローに対して実行するアクションをより詳細に制御できます。また、一致を定義するためのより高度な構文も使用できます。
ON EXISTING 句を指定すると、データベースサーバは各入力ローに対してプライマリキールックアップを実行します。対応するローがテーブルに存在しなければ、新しいローを挿入します。ローがテーブルにすでに存在する場合は、入力ローを無視する (SKIP)、重複したキー値のエラーメッセージを生成する (ERROR)、入力ローの値を使用して古い値を更新する (UPDATE) 操作のいずれかを選択できます。ON EXISTING 句を指定しなかった場合は、デフォルトでは、ローがすでに存在するテーブルにローを挿入しようとすると、キー値の重複エラーになります。また、ON EXISTING ERROR 句を指定するときと同じです。スキップされるローは、@@rowcount 変数に含まれます。
ON EXISTING UPDATE を使用している場合、入力したローは格納されているローと比較されます。入力ローに指定されているすべてのカラム値は、格納されているローの対応するカラム値を置換します。同様に、入力ローに明示的にカラム値が指定されていない場合、格納されているローの対応するカラム値は変化しません。ただし、デフォルト値があるカラムの場合は例外です。また、デフォルト値があるカラム (DEFAULT AUTOINCREMENT カラムなど) を含む ON EXISTING UPDATE 句を使用する場合、ON EXISTING UPDATE DEFAULTS ON を指定することでデフォルト値でカラム値を更新するか、ON EXISTING UPDATE DEFAULTS OFF を指定してカラム値をそのままにすることができます。何も指定しない場合、デフォルトの動作は ON EXISTING UPDATE DEFAULTS OFF です。
DEFAULTS ON パラメータと DEFAULTS OFF パラメータは、DEFAULT TIMESTAMP、DEFAULT UTC TIMESTAMP、または DEFAULT LAST USER の値に関係ありません。これらのカラムでは、格納されているローの値は UPDATE 中に常に更新されます。
ON EXISTING SKIP 句と ON EXISTING ERROR 句を使用するときにテーブルにデフォルトのカラムが含まれていると、サーバは、すでに存在するローに対しても、デフォルト値を計算します。結果として、AUTOINCREMENT のようなデフォルト値が、スキップされたローに対しても影響を及ぼします。AUTOINCREMENT の場合は、AUTOINCREMENT のシーケンスで値がスキップされます。次の例で説明します。
CREATE TABLE t1( c1 INT PRIMARY KEY, c2 INT DEFAULT AUTOINCREMENT ); INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 20 ); INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 20 ); INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 30 ); |
最初の INSERT 文に定義されたローが挿入され、c2 は 1 に設定されます。2 番目の INSERT 文に定義されたローは、既存のローに一致するため、スキップされます。ただし、オートインクリメントカウンタは 2 に増分されたまま残ります (既存のローには影響ありません)。3 番目の INSERT 文に定義されたローが挿入され、c2 の値は 3 に設定されます。したがって、上記の例で挿入された値は次のようになります。
20,1 30,3 |
SQL Remote を使用している場合、DEFAULT LAST USER カラムをレプリケートしないでください。カラムをレプリケートすると、カラム値はレプリケートされた値ではなく、SQL Remote ユーザに設定されます。
OPTION 句 この句は、文を実行するためのヒントを指定するときに使用します。次のヒントがサポートされます。
OPTION( isolation_level = ... )
の指定は、クエリの独立性レベルを指定する他のいずれの手段よりも優先されます。
INSERT 文を使って、データベーステーブルに新しいローを追加します。
テキストインデックスとマテリアライズドビューは基本となるテーブルデータの変更によって影響を受けるため、基本となるテーブルにデータをバルクロード (LOAD TABLE、INSERT、MERGE) する前に、従属するテキストインデックスまたはマテリアライズドビューをトランケートすることを検討してください。
構文 1 指定された式のカラム値を使用して、1 つのローまたは複数のローを挿入します。複数のローを指定する場合は、追加のカッコで区切ります。キーワード DEFAULT を使うと、カラムのデフォルト値を挿入できます。オプションのカラム名のリストを指定すると、指定したカラムの中に値が 1 つずつ挿入されます。カラム名のリストを指定しないと、作成順 (SELECT * を使って取り出すときと同じ順序) に値がテーブルカラムの中に挿入されます。ローは、テーブル内の任意の位置に挿入されます。リレーショナルデータベースでは、テーブルの順序は指定されません。
構文 2 一般的な SELECT 文の結果を使用して、テーブルに大量に挿入します。SELECT 文に ORDER BY 句が含まれていない場合、任意の順序で挿入が行われます。
カラム名を指定すると、SELECT リストのカラムは、カラムリストに指定されたカラムまたは作成順に並べたカラムと順に一致します。
ビューを定義しているクエリ指定が更新可能な場合は、ビューに対して挿入操作を実行できます。
テーブルに挿入した文字列は、データベースが大文字と小文字を区別するかどうかに関係なく、常に入力された大文字と小文字の状態のままで格納されます。そのため、テーブルに挿入される文字列 'Value' は、常に V が大文字、残りの文字が小文字でデータベースに格納されます。SELECT 文は、文字列を Value として返します。ただし、データベースで大文字と小文字が区別されない場合は、すべての比較において Value は value、VALUE などと同じと見なされます。さらに、単一カラムのプライマリキーにエントリ Value がある場合は、プライマリキーがユニークでなくなるので、INSERT 文による value の追加は拒否されます。
INSERT 文を使用してデータを大量に挿入する場合も、カラム統計は更新されます。
テーブルに多数のローを挿入するには、個別の INSERT 文を多数実行するよりも、可能であればカーソルを宣言し、そのカーソルを通じてローを挿入する方が効率的です。データを挿入する前に、テーブルページごとに今後の更新のために確保する空き領域の割合を指定できます。
テーブルの所有者であるか、INSERT ANY TABLE 権限を持っているか、またはテーブルに対する INSERT 権限を持っていることが必要です。さらに、ON EXISTING UPDATE 句が指定されている場合は、UPDATE ANY TABLE システム権限を持っているか、またはテーブルに対する UPDATE 権限を持っていることが必要です。
なし
SQL/2008 INSERT 文は、SQL/2008 標準のコア機能です。DEFAULT VALUES 句は、オプションの SQL 言語機能 F222、"INSERT statement: DEFAULT VALUES clause" です。INSERT 文でのロー値コンストラクタのサポートは、オプションの SQL 言語機能 F641、"Row and table constructors" の一部です。VALUES キーワードはベンダー拡張であり、SQL Anywhere で挿入する式のリストを指定する場合に必須です。ただし、VALUES は SQL/2008 には含まれていません。
いくつかのオプションの構成はベンダー拡張です。これらのベンダー拡張を次に示します。
INSERT...ON EXISTING 句はベンダー拡張です。多くの場合、SQL/2008 準拠の機能では、MERGE 文が同義となります。
OPTION 句。
WITH AUTO NAME 句。
データベースに Eastern Sales 部を追加します。
INSERT INTO GROUPO.Departments ( DepartmentID, DepartmentName ) VALUES ( 230, 'Eastern Sales' ); |
テーブル DepartmentHead を作成し、WITH AUTO NAME 構文を使用して部長とその部の名前を挿入します。
CREATE TABLE DepartmentHead( pk INT PRIMARY KEY DEFAULT AUTOINCREMENT, DepartmentName VARCHAR(128), ManagerName VARCHAR(128) ); INSERT INTO DepartmentHead WITH AUTO NAME SELECT GivenName || ' ' || Surname AS ManagerName, DepartmentName FROM GROUPO.Employees JOIN GROUPO.Departments ON EmployeeID = DepartmentHeadID; |
テーブル MyTable6 を作成し、WITH AUTO NAME 構文を使用してデータを移植します。
CREATE TABLE MyTable6( pk INT PRIMARY KEY DEFAULT AUTOINCREMENT, TableName CHAR(128), TableNameLen INT ); INSERT INTO MyTable6 WITH AUTO NAME SELECT length(t.table_name) AS TableNameLen, t.table_name AS TableName FROM SYS.SYSTAB t WHERE table_id <= 10; |
データベースの現在の独立性レベル設定ではなく、独立性レベル 3 で文を実行し、新しい部署を挿入します。
INSERT INTO GROUPO.Departments (DepartmentID, DepartmentName, DepartmentHeadID) VALUES(600, 'Foreign Sales', 129) OPTION( isolation_level = 3 ); |
次の例では、架空のテーブル T に 3 つのローを挿入します。
INSERT INTO T (c1,c2,c3) VALUES (1,10,100), (2,20,200), (3,30,300); |
次の例では、架空のテーブル T に、各カラムにデフォルト値が定義されている 4 つのカラムの 3 つのローを挿入します。
INSERT INTO T () VALUES (), (), (); |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |