UPDATE¶
ターゲットテーブルの指定された行を新しい値で更新します。
構文¶
UPDATE <target_table>
SET <col_name> = <value> [ , <col_name> = <value> , ... ]
[ FROM <additional_tables> ]
[ WHERE <condition> ]
必須パラメーター¶
target_table
更新するテーブルを指定します。
col_name
target_table
の列の名前を指定します。テーブル名は含めないでください。たとえば、UPDATE t1 SET t1.col = 1
は無効です。value
col_name
に設定する新しい値を指定します。
オプションのパラメーター¶
FROM additional_tables
更新する行の選択または新しい値の設定に使用する1つ以上のテーブルを指定します。ターゲットテーブルを繰り返すと、自己結合が行われることに注意してください。
WHERE condition
更新するターゲットテーブルの行を指定する式。
デフォルト:値なし(ターゲットテーブルのすべての行が更新されます)
使用上の注意¶
FROM 句で、テーブル間に JOIN が含まれている場合(例:
t1
とt2
)、t1
のターゲット行は、テーブルt2
の複数の行を結合(つまり一致)する場合があります。これが発生すると、ターゲット行は 複数結合行 と呼ばれます。複数結合行を更新する場合、 ERROR_ON_NONDETERMINISTIC_UPDATE セッションパラメーターは更新の結果を制御します。FALSE
(デフォルト値)の場合、エラーは返されず、結合行の1つがターゲット行の更新に使用されます。ただし、選択された結合行は非決定的です。IF
TRUE
、複数の行を結合するターゲット行の値の例を含むエラーが返されます。
パラメーターを設定するには:
ALTER SESSION SET ERROR_ON_NONDETERMINISTIC_UPDATE=TRUE;
例¶
2つのテーブルを使用して標準の更新を実行します。
UPDATE t1 SET number_column = t1.number_column + t2.number_column, t1.text_column = 'ASDF' FROM t2 WHERE t1.key_column = t2.t1_key and t1.number_column < 10;
非決定的な結果を生成する結合で更新します。
select * from target; +---+----+ | K | V | |---+----| | 0 | 10 | +---+----+ Select * from src; +---+----+ | K | V | |---+----| | 0 | 11 | | 0 | 12 | | 0 | 13 | +---+----+ -- Following statement joins all three rows in src against the single row in target UPDATE target SET v = src.v FROM src WHERE target.k = src.k; +------------------------+-------------------------------------+ | number of rows updated | number of multi-joined rows updated | |------------------------+-------------------------------------| | 1 | 1 | +------------------------+-------------------------------------+
ERROR_ON_NONDETERMINISTIC_UPDATE = FALSEの場合、ステートメントは
src
の次の行のいずれかの値を使用して、target
の単一の行をランダムに更新します。
(0, 11)
,(0, 12)
,(0,13)
ERROR_ON_NONDETERMINISTIC_UPDATE = TRUE の場合、重複した DML 行
[0, 10]
を報告するエラーが返されます。
この非決定的な動作とエラーを回避するには、1対1の結合を使用します。
UPDATE target SET v = b.v FROM (SELECT k, MIN(v) v FROM src GROUP BY k) b WHERE target.k = b.k;このステートメントにより、
target
の単一行が(0, 11)
(src
のv
の最小値を持つ行の値)に更新され、結果がエラーになることはありません。