指定されたテーブルの指定された列に新しい値を設定します。
Synopsis
UPDATE [restriction] table value-assignment-statement
[WHERE condition-expression]
UPDATE [restriction] table value-assignment-statement
[WHERE CURRENT OF cursor [AND condition-expression]]
where value-assignment-statement can be:
SET columns = scalar-expressions
SET columns = [(columns)] VALUES (scalar-expressions)
SET columns = [(columns)] VALUES host-variable
UPDATE 文は、テーブルの列の既存値を変更します。テーブルの行の更新は、直接行う方法と、ビューを使用した方法があります。ビューを使用して更新する場合は、
CREATE VIEW で説明されているように、必要条件や制限事項に従います。
UPDATE 文は、既存のベース・テーブルの行 (単独もしくは複数) に、新規の列の値を提供します。更新には、2 つの構文が利用できます。
WHERE 節または
WHERE CURRENT OF 節が更新の範囲を制限しない限り、すべての更新はテーブル全体を更新するとみなされます。例えば以下のようになります。
UPDATE Employees
SET StatusDate = '05/12/98', status = 'Purged'
WHERE status = 'Completed'
column-list 引数はオプションです。使用する場合、更新したい列をコンマで区切られたリストにします。省略した場合は、すべての列を更新するとみなされます。
UPDATE オペレーションは全か無かのイベントです。指定された行および列をすべて更新するか、まったくしないかのいずれかです。また、
UPDATE 操作により、
%ROWCOUNT ローカル変数が更新された行数に設定されます。
Caché は、
UPDATE の成功または失敗を示す、ステータス変数 SQLCODE を返します。テーブルの行を更新するには、以下の条件を満たしている必要があります。
-
テーブルへの UPDATE 特権があること。この特権を持っていないと SQLCODE -99 (特権違反) エラーになります。詳細は、"
GRANT" コマンドを参照してください。
-
テーブルを READONLY として定義することはできません。読み取り専用テーブルを参照する
UPDATE をコンパイルしようとすると、SQLCODE -115 エラーが返されます。このエラーは実行時にのみ発生するのではなく、コンパイル時にも発生するようになったことに注意してください。"
Caché オブジェクトの使用法" の "
オブジェクトの永続性" の章で READONLY オブジェクトの説明を参照してください。
-
ビュー経由でテーブルを更新する場合、ビューを WITH READ ONLY として定義することはできません。これを実行しようとすると、SQLCODE -35 エラーが返されます。詳細は、"
CREATE VIEW" コマンドを参照してください。
-
RowId フィールドや IDENTITY フィールドのような変更不可フィールドは更新できません。これらのフィールドの値はシステムで生成され、ユーザは変更できません。これを実行しようとすると、SQLCODE -107 エラーが返されます。詳細は、"
CREATE TABLE" コマンドを参照してください。
-
複数行の
UPDATE はアトミック処理です。1 行または複数行の更新できない行があると、
UPDATE 処理は失敗し、どの行も更新されません。例えば、指定された行の 1 つについての更新が外部キーの参照整合性に違反する場合、
UPDATE はどの行も更新できません。
-
%NOCHECK 外部キーの参照整合性チェックは実行されません。ビューを介して
UPDATE を実行する場合、ビューの WITH CHECK OPTION 検証は実行されません。
-
%NOLOCK
UPDATE 時に行をロックしません。単独のユーザ/処理がデータベースを更新する際にのみ使用します。
-
%NOINDEX インデックス・マップは
UPDATE 処理中には設定されません。
-
%NOTRIGGER ベース・テーブル・トリガは
UPDATE 処理中にはかかりません (実行されません)。BEFORE トリガおよび AFTER トリガのどちらも実行されません。
%NOCHECK を指定しない場合、Caché ではシステム構成設定を使用して外部キーの参照整合性チェックを実行するかどうかが決まります。システムの既定値は以下のように設定できます。
-
ObjectScript $SYSTEM.SQL.SetFilerRefIntegrity() 関数を呼び出します。
-
UPDATE 処理中は、更新するフィールド値を持つ外部キーの参照があるたびに、参照するテーブルの古い (更新前の) 参照行と新しい (更新後の) 参照行の両方で共有ロックを取得します。これらの行は、トランザクションの終了までロックされます。古い行をロックすることにより、参照される行は、
UPDATE のロールバックがあってもそれより前に変更されることがなくなります。新しい行をロックすることにより、参照されている行は、
UPDATE の参照整合性チェックからトランザクションの終了までの間、変更されないことが保証されます。
%NOLOCK を指定しない場合、Caché は、
INSERT、
UPDATE、および
DELETE 操作時に標準のロックを実行します。一意フィールドの値は、現行のトランザクションの間、ロックされます。
既定のロックしきい値は、テーブルごとに 1000 ロックです。これは、トランザクション時にテーブルから 1000 を超える一意フィールド値を更新する場合、ロックしきい値に到達し、Caché がロック・レベルを自動的に、一意フィールド値ロックからテーブル・ロックへと上げることを意味します。これによってトランザクション時に、ロック・テーブルをオーバーフローすることなく、大規模な更新を実行できます。このロックしきい値は設定可能です。トランザクションでのロックの詳細は、このドキュメントの "SQL の概念" の "
トランザクション" を参照してください。