テーブルに新しい行を追加します。
Synopsis
INSERT restriction INTO table
[(column-commalist)] query |
[(column-commalist)] VALUES
(scalar-expression-commalist) |
[(column-commalist)] VALUES host-variable |
SET column = scalar-expression
{,column = scalar-expression}
INSERT 文は、テーブルに新しい行を 1 つ追加します。テーブルに直接挿入、またはビュー経由で挿入できます。ビュー経由で挿入する場合は、
CREATE VIEW で説明されているように、必要条件や制限事項に従います。
INSERT は全か無かのイベントです。列が完全に挿入されるか、またはまったく挿入されないかのどちらかとなります。Caché は、SQLCODE ステータス変数を返し、
INSERT の成功もしくは失敗を示します。テーブルに行を挿入するには、以下の条件を満たしている必要があります。
-
テーブル名が存在していること。存在しないテーブルに対して挿入を実行すると、SQLCODE=-30 エラーが返されます。
-
テーブルへの書き込み特権があること。読み取りのみのテーブルに対して挿入を実行すると、SQLCODE=-115 エラーが返されます。
-
すべての必須フィールドが挿入処理に指定されていること。必須フィールドの値を指定せずに行を挿入すると、SQLCODE=-108 エラーが返されます。
-
システム生成値のみが格納される RowID や IDKey などのフィールドが挿入対象として指定されていないこと。これらのフィールドのいずれかに非 NULL フィールド値を挿入すると、SQLCODE=-111 エラーが返されます。これらのフィールドのいずれかに NULL 値を挿入すると、Caché はその NULL をシステム生成値でオーバーライドします。したがって、挿入処理は成功し、エラー・コードは発行されません。
-
各フィールドの値が有効な値であること。無効なフィールド値を挿入すると、SQLCODE=-104 エラーが返されます。
-
すべてのフィールド値がすべてのフィールド制約に合格すること。例えば、一意制約のあるフィールドに重複フィールド値を挿入すると、SQLCODE=-119 エラーが返されます。
列のリストを省略すると、
INSERT は、すべての列が列番号順で挿入されるものと判断します。列のリストを指定すると、個々の値は、列のリスト内の列の名前と位置的に一致する必要があります。
INSERT オペレーションは、%ROWCOUNT 変数を、影響を受けた行の番号に設定します (必ず 0 または 1 のどちらか)。
-
%NOCHECK ビュー経由で
INSERT を実行する際、ビューの WITH CHECK OPTION 検証は実行されません。
-
%NOLOCK
INSERT 時に行をロックしません。単独のユーザ/処理がデータベースを更新する際にのみ使用します。
-
%NOINDEX インデックス・マップは
INSERT 処理中には設定されません。
-
%NOTRIGGER ベース・テーブル・トリガは
INSERT 処理中にはかかりません。
%NOLOCK を指定しない場合、Caché は、
INSERT、
UPDATE、および
DELETE 操作時に標準のロックを実行します。一意フィールドの値は、現行のトランザクションの間、ロックされます。ロックしきい値は、テーブルごとに 1000 ロックです。そのため、トランザクション時にテーブルから 1000 を超える一意フィールド値を挿入する場合は、ロックしきい値に到達し、Caché はロック・レベルを自動的に、一意フィールド値ロックからテーブル・ロックへと上げます。これによってトランザクション時に、ロック・テーブルをオーバーフローすることなく、大規模な挿入を実行できます。ロックの詳細は、このドキュメントの "SQL の概念" の "
トランザクション" を参照してください。
以下の例は、Name、DOB、SSN の 3 つのフィールド値を持つ行を挿入します。
&sql(INSERT INTO Sample.Person (Name,DOB,SSN) VALUES
('David Vanderbilt', 46639,'123-45-6789'))
WRITE !,"Error code=",SQLCODE,!,"Row count=",%ROWCOUNT
ホスト変数構文では、
INSERT に値の配列を渡すために、最後の添え字が未定義の変数参照を使用できます。例えば以下のようになります。
&sql(INSERT INTO Sample.Employee VALUES :emp("profile",))
WRITE !,"SQL Error code: ",SQLCODE," Row Count: ",%ROWCOUNT
これは、挿入された "Employee" 行の各フィールドを以下のように設定します。
ここでの "col" は、Sample.Employee テーブル内のフィールド列番号です。
INSERT INTO StudentRoster (NAME,GPA,ID_NUM)
SELECT FullName,GradeAvg,ID
FROM temp WHERE SchoolYear = '2004'