SQL 解説書
UPDATE ステートメントは、表または視点の行の指定された列の値を更新します。
視点の行の更新により、その基礎表の行が更新されます。
このステートメントの形式は以下のとおりです。
- 探索条件付き UPDATE 形式は、
1 つまたは複数の行 (任意指定の探索条件によって決まる) を更新する場合に使用されます。
- 位置指定 UPDATE 形式は、
1 行 (カーソルの現在位置によって決まる) だけを更新する場合に使用されます。
呼び出し
UPDATE ステートメントは、アプリケーション・プログラムに組み込むか、
あるいは動的 SQL ステートメントの使用によって発行することができます。
このステートメントは、動的に準備可能な実行可能ステートメントです。
許可
このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。
- 更新する行を含む表または視点に対する UPDATE 特権
- 更新するそれぞれの行に対する UPDATE 特権
- その行を更新する表または視点に対する CONTROL 特権
- SYSADM または DBADM 権限
- 割り当て式に row-fullselect (行全選択) を含める場合には、
参照される表または視点のそれぞれに対して、少なくとも次のいずれかが必要です。
- SELECT 特権
- CONTROL 特権
- SYSADM または DBADM 権限
副照会によって参照される表または視点のそれぞれに対して、
このステートメントの許可 ID が持つ特権には以下の少なくとも 1 つが含まれている必要があります。
- SELECT 特権
- CONTROL 特権
- SYSADM または DBADM 権限
パッケージが SQL92 規則を使用してプリコンパイルされており
107
、
UPDATE の探索条件付き形式で assignment-clause の右側
または search-condition のいずれかの個所に表または視点の列への参照が含まれている場合、
このステートメント許可 ID が持つ特権には、
さらに以下の少なくとも 1 つが含まれている必要があります。
- SELECT 特権
- CONTROL 特権
- SYSADM または DBADM 権限
指定した表または視点が ONLY キーワードの後にくる場合、
ステートメントの許可 ID が持つ特権にも、
指定した表または視点の副表または副視点ごとに SELECT 特権が含まれている必要があります。
静的 UPDATE ステートメントの場合、GROUP 特権は検査されません。
構文
Searched (探索条件付き) UPDATE:
>>-UPDATE----+-table-name-------------------+------------------->
+-view-name--------------------+
'-ONLY--(--+-table-name-+---)--'
'-view-name--'
>-----+---------------------------+----------------------------->
| .-AS-. |
'-+----+--correlation-name--'
>-----SET--| assignment-clause |------------------------------->
>-----+--------------------------+-----------------------------><
'-WHERE--search-condition--'
Positioned (位置指定) UPDATE:
>>-UPDATE----+-table-name-------------------+------------------->
+-view-name--------------------+
'-ONLY--(--+-table-name-+---)--'
'-view-name--'
>-----SET--| assignment-clause |------------------------------->
>-----WHERE CURRENT OF--cursor-name----------------------------><
assignment-clause
.-,---------------------------------------------------------------------------------------------------------.
V |
|-------+-column-name--+--------------------------+---=--+-expression-+--------------------------------------+--+->
| | .--------------------. | +-NULL-------+ |
| | V | | '-DEFAULT----' |
| '----..attribute-name---+--' |
| .-,-------------------------------------------. .-,----------------------. |
| V | V (1) | |
'-(-----column-name--+--------------------------+--+---)--=--(--+----+-expression-+---------+-+---)--'
| .--------------------. | | +-NULL-------+ |
| V | | | '-DEFAULT----' |
'----..attribute-name---+--' | (2) |
'-row-fullselect--------------'
>---------------------------------------------------------------|
注:
- expression、NULL、および DEFAULT の数は、
column-name の数と同じでなければなりません。
- 選択リスト中の列の数は、
column-name の数と同じでなければなりません。
説明
- table-name または view-name
- 更新する表または視点の名前です。
この名前は、カタログに記述されている表または視点を指定する名前でなければならず、
カタログ表、カタログ表の視点 (更新可能な SYSSTAT 視点を除く)、
要約表、読み取り専用の視点、またはニックネームを指定することはできません。
(読み取り専用の視点については、CREATE VIEW を参照してください。
更新可能なカタログ視点については、付録 D, カタログ視点を参照してください。)
table-name がタイプ付き表である場合は、
このステートメントを使用すれば、その表またはそれに関係する副表の行を更新できます。
WHERE 節に設定または参照できるのは、指定された表の列だけです。
位置指定 UPDATE の場合は、FROM 文節に指定されているのと同じ表または視点を、
関連するカーソルにも ONLY を使用せずに指定しなければなりません。
- ONLY (table-name)
- タイプ付き表の場合に適用できます。
ONLY キーワードは、指定した表のデータだけをステートメントが適用し、
その表に関係する副表の行は更新できないことを指定します。
位置指定 UPDATE の場合は、FROM 文節に指定されているのと同じ表を、
関連するカーソルにも ONLY を使用して指定しなければなりません。
table-name がタイプ付き表でない場合は、
このステートメントに ONLY を使用しても効果はありません。
- ONLY (view-name)
- タイプ付き視点の場合に適用できます。
ONLY キーワードは、指定された視点のデータだけをステートメントが適用し、
その表に関係する副視点の行は更新できないことを指定します。
位置指定 UPDATE の場合は、FROM 文節に指定されているのと同じ視点を、
関連するカーソルにも ONLY を指定して指定しなければなりません。
view-name がタイプ付き視点でない場合は、
このステートメントに ONLY キーワードを使用しても効果はありません。
- AS
- correlation-name (相関名) の前に任意に指定できるキーワードです。
- correlation-name
- 探索条件 (search-condition) の中で、
表または視点を指定するのに使用することができます。
(相関名については、相関名 を参照してください。)
- SET
- この後に、列名への値の割り当て (assignment-clause) を指定します。
- assignment-clause
-
- column-name
- 更新したい列を指定します。
column-name (列名) は、
指定した表または視点の更新可能な列を指定していなければなりません。
108
タイプ付き表のオブジェクト識別子列は更新できません (SQLSTATE 428DZ)。
属性名 (attribute-name) を付けて指定しない限り、
1 つの列を 2 回以上指定することはできません (SQLSTATE 42701)。
位置指定 UPDATE の場合 :
- カーソルの選択ステートメントに UPDATE 文節を指定した場合、
この assignment-clause の各列名は、
その UPDATE 文節にも指定されていなければなりません。
- カーソルの選択ステートメントに UPDATE 文節を指定せず、
アプリケーションのプリコンパイル時に LANGLEVEL MIA または SQL92E が指定されていた場合には、
更新可能な列の名前はいずれも指定することができます。
- カーソルの選択ステートメントに UPDATE 文節を指定せず、
アプリケーションのプリコンパイル時に LANGLEVEL SAA1 を
明示的にまたはデフォルト値として指定していた場合には、列は更新できません。
- ..attribute-name
- 設定されている構造タイプの属性 (属性割り当て という) を指定します。
指定される column-name は、
ユーザー定義構造タイプで定義されているものでなければなりません (SQLSTATE 428DP)。
attribute-name は、
column-name の構造タイプの属性でなければなりません (SQLSTATE 42703)。
..attribute-name 文節と関係のない割り当ては、
通常の割り当て とみなされます。
- expression
- 列の新しい値を指定します。
この expression (式) として、
式 で説明されているタイプの式はいずれも使用することができます。
スカラー全選択に現れる式を除き、
この式に列関数を含めることはできません (SQLSTATE 42903)。
expression には、
UPDATE ステートメントのターゲット表の列への参照を含めることができます。
更新対象の行ごとに、式の中のそのような列の値は、行の更新前のその行の列の値になります。
- NULL
- ヌル値を指定します。
これはヌル値可能な列に対してのみ指定することができます (SQLSTATE 23502)。
NULL が特に属性のデータ・タイプにキャストされたのでない限り、
属性割り当ての値として NULL を使用することはできません (SQLSTATE 429B9)。
- DEFAULT
- 対応する列の表における定義方法に基づくデフォルト値を使用することを指定します。
挿入される値は、その列の定義方法によって異なります。
- 式に基づいて生成された列として列が定義されている場合は、
その式に基づいた列の値がシステムによって生成されます。
- IDENTITY 文節を使用して列が定義された場合は、
データベース・マネージャーによって値が生成されます。
- 列が WITH DEFAULT 文節を指定して定義されている場合、
値はその列に対して定義されたデフォルト値に設定されます (ALTER TABLE の default-clause を
参照してください)。
- WITH DEFAULT 文節、GENERATED 文節、
および NOT NULL 文節のいずれも指定せずに列が定義された場合は、値 NULL が使用されます。
- 列の定義に NOT NULL 文節が使用されたが GENERATED 文節が使用されなかった場合、
また WITH DEFAULT 文節が使用されていない場合や DEFAULT NULL が使用されている場合は、
その列に DEFAULT キーワードを指定することはできません (SQLSTATE 23502)。
生成された列が GENERATED ALWAYS 文節で定義されている場合は、
DEFAULT 以外の値を挿入することはできません (SQLSTATE 428C9)。
属性割り当てでは、DEFAULT キーワードを値として使用することはできません (SQLSTATE 429B9)。
- row-fullselect
- 割り当て式に指定した列名 の数に対応する数の列を含む 1 つの行を戻す全選択です。
値は、それぞれ対応する列名 に割り当てられます。
この行全選択 の結果の行がない場合は、NULL 値が割り当てられます。
row-fullselect (行全選択) には、
UPDATE ステートメントのターゲット表の列に対する参照を含めることができます。
更新対象の行ごとに、式の中のそのような列の値は、
行の更新前のその行の列の値になります。
結果に複数の行が含まれる場合には、エラーになります (SQLSTATE 21000)。
- WHERE
- この後に、更新したい行を識別する条件を指定します。
この文節は、省略することも、探索条件を指定することも、
またはカーソル名を指定することもできます。
この文節を省略すると、表または視点のすべての行が更新されます。
- search-condition
- 言語要素 の説明に基づいて、探索条件を指定します。
副照会以外の探索条件の各列名 は、
表または視点の列を指定していなければなりません。
探索条件に、同じ表が UPDATE と副照会の両方の基本オブジェクトである副照会が含まれている場合、
行が更新される前に、その副照会が完全に評価されます。
探索条件は、表または視点の各行に適用され、探索条件の結果が「真」の行が更新されます。
探索条件に副照会が含まれる場合、その副照会は、
探索条件が 1 つの行に適用されるたびに実行され、
その結果は探索条件の適用に使用されるものとみなされます。
実際には、相関参照が含まれていない副照会は一度実行されるのに対し、
相関参照を含む副照会は各行ごとに一度ずつ実行しなければならない場合があります。
- CURRENT OF cursor-name
- 更新操作で使用するカーソルを指定します。
DECLARE CURSOR で説明されているように、
cursor-name (カーソル名) は、
宣言されたカーソルを識別していなければなりません。
プログラムで、UPDATE ステートメントよりも前に、
該当の DECLARE CURSOR ステートメントがなければなりません。
指定する表または視点は、
そのカーソルの SELECT ステートメントの FROM 文節でも指定されていなければならず、
またそのカーソルの結果表が読み取り専用であってはなりません。
(読み取り専用の結果表については、DECLARE CURSOR を参照してください。)
UPDATE ステートメントが実行される時点で、
そのカーソルは行に位置づけられていなければなりません。その行が更新されます。
視点を定義する全選択の選択リストの OLAP 関数を含む視点を更新する場合は、
この形式の UPDATE を使用することはできません (SQLSTATE 42828)。
規則
- 割り当て:
更新値は、"言語要素"で説明されている
割り当て規則に従って列に割り当てられます。
- 妥当性: 更新される行は、
更新される列の固有索引がある場合には、
それによってその表 (または視点の基礎表) に適用される制約に適合していなければなりません。
WITH CHECK OPTION を使用して定義されていない視点が使用される場合、
行が変更され、その結果、それらの行がその視点の定義に適合しないことになる場合があります。
そのような行は、視点の基礎表で更新され、その視点には現われなくなります。
WITH CHECK OPTION を用いて定義された視点を使用する場合、
更新された行は、その視点の定義に従っていなければなりません。
この状況に関連する規則については、CREATE VIEW を参照してください。
- 検査制約: 更新値は、
表に定義されている検査制約の検査条件を満たしていなければなりません。
検査制約が定義されている表に対する UPDATE では、
更新される各行ごとに一度、更新される各列に対して制約条件が評価されます。
UPDATE ステートメントが処理される時点で、
更新される列を参照している検査制約だけが検査されます。
- 参照保全:
更新規則が RESTRICT で、従属行が存在する場合には、
親の固有キーの値は変更できません。
ただし、NO ACTION の更新規則では、
更新ステートメントの完了時にすべての子が親キーを持つ場合、
親の固有キーを更新することができます。
NULL 以外の外部キーの更新値は、
関連する親表の基本キーの値に等しくなければなりません。
注
- 更新値が制約のいずれかに違反している場合、
または UPDATE ステートメントの実行時に他のエラーが発生した場合、行は更新されません。
複数の行が更新される順序は、決められていません。
- UPDATE ステートメントの実行が完了すると、
SQLCA の SQLERRD(3) の値は更新された行の数を示します。
SQLERRD(5) フィールドには、活動化されたすべてのトリガーによって挿入、
削除、または更新された行の数が入れられます。
SQLCA については、付録 B, SQL 連絡 (SQLCA) を参照してください。
- 適切なロックがすでに存在している場合を除き、
正常な UPDATE ステートメントを実行によって、
1 つまたは複数の排他ロックが獲得されます。
そのようなロックが解放されるまで、更新された行には、
その更新を行ったアプリケーション・プロセス以外はアクセスできません (非コミット読み取り分離レベルを使用する
アプリケーションを除く)。
ロックについては、
COMMIT、ROLLBACK、および LOCK TABLE の各ステートメントの説明を参照してください。
- DATALINK 列の URL 値を更新する場合、
それは古い DATALINK 値を削除してから新しい DATALINK 値を挿入するのと同じです。
最初に、古い値があるファイルにリンクされていれば、
そのファイルをリンク解除されます。
次に、DATALINK 値のリンケージ属性が空でなければ、
指定されたファイルがその列にリンクされます。
DATALINK 列のコメント値は、
空のストリングを URL パスとして指定することにより再リンクさせなくても (たとえば、
DLVALUE スカラー関数の data-location 引き数を指定したり、
古い値と同じ値を新しい値として指定したりしなくても)、更新することができます。
DATALINK 値を更新してヌルにすることは、既存の DATALINK 値を削除することと同じです。
DATALINK 値を更新しようとしたときに、
既存の値または新しい値のファイル・サーバーのいずれかがデータベースに登録されていないと、
エラーになる場合があります (SQLSTATE 55022)。
- タイプ付き表の列分散統計を更新する場合は、
列を最初に参照した副表を指定しなければなりません。
- 同じ構造タイプの列で複数の属性割り当てが行われる場合は、
SET 文節で (括弧付きで挿入された SET 文節では左から右の順番で) 指定された順に属性が割り当てられます。
- 属性割り当てでは、
ユーザー定義構造タイプの属性に対して mutator メソッドが呼び出されます。
たとえば、割り当て st..a1=x は、
割り当て st = st..a1(x) で mutator メソッドを使用した場合と同じ働きをします。
- 通常の割り当ての場合、
指定された列に対しては 1 つの割り当てしか行われませんが、
属性割り当てでは、1 つの列が複数の割り当てのターゲット列になることができます (ただし、
通常の割り当てでターゲット列として指定されていない場合)。
- 特殊タイプとして定義された識別列が更新された場合は、
まずすべての計算がソース・タイプで行われます。
そして計算された値は、値が列に実際に割り当てられるときに、
ソース・タイプから定義された特殊タイプにキャストされます。
109
- 識別列に対する SET ステートメントで DB2 によって値が生成されるようにするには、
DEFAULT キーワードを使用します。
SET NEW.EMPNO = DEFAULT
この例では、NEW.EMPNO が識別列として定義されており、
この列の更新に使用される値は DB2 によって生成されます。
- 識別列に生成されるシーケンス値の使用に関する詳細は、
INSERTを参照してください。
- 識別列で値が最大値を超えた場合の詳細は、
INSERTを参照してください。
例
- 例 1: EMPLOYEE 表において、
従業員番号 (EMPNO) '000290' のジョブ (JOB) を 'LABORER' に変更します。
UPDATE EMPLOYEE
SET JOB = 'LABORER'
WHERE EMPNO = '000290'
- 例 2: PROJECT 表において、
部門 (DEPTNO) 'D21' が担当しているすべてのプロジェクトについて、
プロジェクトのスタッフ・レベル (PRSTAFF) を 1.5 増やします。
UPDATE PROJECT
SET PRSTAFF = PRSTAFF + 1.5
WHERE DEPTNO = 'D21'
- 例 3: 部門 (WORKDEPT) 'E21' の管理者以外の全従業員が一時的に配置替えになったとします。
このことは、EMPLOYEE 表において、そのジョブ (JOB) を NULL 値に、
給与額 (SALARY、BONUS、COMM) をゼロに変更することにより示されます。
UPDATE EMPLOYEE
SET JOB=NULL, SALARY=0, BONUS=0, COMM=0
WHERE WORKDEPT = 'E21' AND JOB <> 'MANAGER'
このステートメントは、次のように書き換えることもできます。
UPDATE EMPLOYEE
SET (JOB, SALARY, BONUS, COMM) = (NULL, 0, 0, 0)
WHERE WORKDEPT = 'E21' AND JOB <> 'MANAGER'
- 例 4: 従業員番号 000120 の従業員の給与と歩合の列を、
それぞれ更新後の行の部門の従業員の平均給与と平均歩合に更新します。
UPDATE EMPLOYEE EU
SET (EU.SALARY, EU.COMM)
=
(SELECT AVG(ES.SALARY), AVG(ES.COMM)
FROM EMPLOYEE ES
WHERE ES.WORKDEPT = EU.WORKDEPT)
WHERE EU.EMPNO = '000120'
- 例 5: C プログラムにおいて、
EMPLOYEE 表の行を表示し、必要に応じて、
特定の従業員のジョブ (JOB) を、キーボードから入力した新しいジョブに変更します。
EXEC SQL DECLARE C1 CURSOR FOR
SELECT *
FROM EMPLOYEE
FOR UPDATE OF JOB;
EXEC SQL OPEN C1;
EXEC SQL FETCH C1 INTO ... ;
if ( strcmp (change, "YES") == 0 )
EXEC SQL UPDATE EMPLOYEE
SET JOB = :newjob
WHERE CURRENT OF C1;
EXEC SQL CLOSE C1;
- 例 6: これらの例では、
列オブジェクトの属性を変化させます。
以下のタイプと表が存在すると想定します。
CREATE TYPE POINT AS (X INTEGER, Y INTEGER)
NOT FINAL WITHOUT COMPARISONS
MODE DB2SQL
CREATE TYPE CIRCLE AS (RADIUS INTEGER, CENTER POINT)
NOT FINAL WITHOUT COMPARISONS
MODE DB2SQL
CREATE TABLE CIRCLES (ID INTEGER, OWNER VARCHAR(50), C CIRCLE
以下の例では、CIRCLES 表を更新して、
OWNER 列と、ID が 999 の CIRCLE 列の RADIUS 属性を変更します。
UPDATE CIRCLES
SET OWNER = 'Bruce'
C..RADIUS = 5
WHERE ID = 999
以下の例では、999 で識別される円の中心の X 座標と Y 座標を転置します。
UPDATE CIRCLES
SET C..CENTER..X = C..CENTER..Y,
C..CENTER..Y = C..CENTER..X
WHERE ID = 999
以下は、上の 2 つのステートメントを別の方法で書いた例です。
この例では、上の例に示した 2 つのステートメントの働きを結合させています。
UPDATE CIRCLES
SET (OWNER,C..RADIUS,C..CENTER..X,C..CENTER..Y) =
('Bruce',5,C..CENTER..Y,C..CENTER..X)
WHERE ID = 999
脚注:
- 107
-
ステートメントの処理に使用されるパッケージは、
値 SQL92E または MIA を指定したオプション LANGLEVEL を使用してプリコンパイルされます。
- 108
-
区分化キーの列は更新できません (SQLSTATE 42997)。
区分化キーの列を変更するには、そのデータの行を削除して挿入し直す必要があります。
- 109
-
計算に先立って、元の値がソース・タイプにキャストされることはありません。
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]