すべてのプロダクト
Search
ドキュメントセンター

PolarDB:UPDATE

最終更新日:May 31, 2024

説明

UPDATEは、条件を満たすすべての行の指定された列の値を変更します。 SET句では、変更する列のみを記述する必要があります。明示的に変更されていない列は以前の値を保持します。

データベース内の他のテーブルに含まれる情報を使用してテーブルを変更するには、サブ選択を使用するか、FROM句で追加のテーブルを指定するかの2つの方法があります。 どのテクニックがより適切かは、特定の状況に依存します。

オプションのRETURNING句を使用すると、実際に更新された各行に基づいてUPDATEが計算され、値が返されます。 テーブルの列、および /またはFROMに記載されている他のテーブルの列を使用する式を計算できます。 テーブルの列の新しい (更新後の) 値が使用されます。 RETURNINGリストの構文は、SELECTの出力リストの構文と同じです。

テーブル、または少なくとも更新するためにリストされている列に対するUPDATE権限が必要です。 また、値がまたは条件で読み取られるすべての列に対してSELECT権限を持つ必要があります。

概要

[ WITH [ RECURSIVE ] with_query [, ...] ]]
    UPDATE [のみ] table_name [ * ] [ [ AS] エイリアス]
        SET { column_name = { expression | DEFAULT } |
              (column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
              (column_name [, ...] ) =(サブSELECT)
            } [, ...]
        [FROM from_item [, ...] ]
        [WHERE condition | cursor_nameの現在の場所]
        [RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] 

パラメーター

  • で_query

    WITH句を使用すると、UPDATEクエリで名前で参照できる1つ以上のサブクエリを指定できます。

  • table_name

    更新するテーブルの名前 (オプションでスキーマ修飾) 。 テーブル名の前にONLYを指定した場合、一致する行は名前付きテーブルのみで更新されます。 ONLYが指定されていない場合、名前付きテーブルから継承されたテーブルで一致する行も更新されます。 必要に応じて、テーブル名の後に * を指定して、子孫テーブルが含まれることを明示的に示すことができます。

  • エイリアス

    ターゲットテーブルの代替名。 エイリアスを指定すると、テーブルの実際の名前が完全に非表示になります。 たとえば、UPDATE foo AS fの場合、UPDATEステートメントの残りの部分は、このテーブルをf not fooとして参照する必要があります。

  • column_name

    table_nameという名前のテーブル内の列の名前。 列名は、必要に応じて、サブフィールド名または配列の下付き文字で修飾できます。 ターゲット列の指定にテーブル名を含めないでください。たとえば、UPDATE table_name SET table_name.col = 1は無効です。

  • 列に割り当てる式。 この式は、テーブル内のthis列と他の列の古い値を使用できます。

  • デフォルト

    列をデフォルト値に設定します (特定のデフォルト式が割り当てられていない場合はNULLになります) 。 identity列は、関連付けられたシーケンスによって生成された新しい値に設定されます。 生成された列の場合、これを指定することは許可されますが、生成式から列を計算する通常の動作を指定するだけです。

  • サブSELECT

    SELECTサブクエリは、その前の括弧で囲まれた列リストにリストされているのと同じ数の出力列を生成します。 サブクエリは、実行時に1つ以下の行を生成する必要があります。 1つの行が得られた場合、その列の値がターゲット列に割り当てられ、行が得られなかった場合、NULL値がターゲット列に割り当てられます。 サブクエリは、更新されているテーブルの現在の行の古い値を参照できます。

  • from_item

    他のテーブルの列をWHERE条件に表示して式を更新できるテーブル式。 これは、SELECTステートメントのFROM句と同じ構文を使用します。たとえば、テーブル名のエイリアスを指定できます。 自己結合を意図しない限り、ターゲットテーブルをfrom_itemとして繰り返さないでください (この場合、from_itemにエイリアスを付けて表示する必要があります) 。

  • 条件

    boolean型の値を返す式。 この式がtrueを返す行のみが更新されます。

  • cursor_name

    WHERE CURRENT of条件で使用するカーソルの名前。 更新される行は、このカーソルから最も最近フェッチされた行である。 カーソルは、UPDATEのターゲットテーブルに対する非グループ化クエリである必要があります。 WHERE CURRENT OFはブール条件と共に指定できません。

  • output_expression

    各行が更新された後にUPDATEコマンドによって計算され、返される式。 この式では、table_nameで指定されたテーブル、またはFROMにリストされているテーブルの任意の列名を使用できます。すべての列を返すには * を書き込みます。

  • output_name

    返される列に使用する名前。

出力

UPDATEコマンドが正常に完了すると、

UPDATE count

countは、値が変更されなかった一致した行を含む、更新された行の数です。

説明

BEFORE UPDATEトリガーによって更新が抑制されたときに、条件に一致した行数よりも少ない場合があります。 countが0の場合、クエリによって更新された行はありません (エラーとは見なされません) 。

UPDATEコマンドにRETURNING句が含まれている場合、結果は、コマンドによって更新された行に対して計算された、RETURNINGリストで定義された列と値を含むSELECTステートメントの結果と同様になります。

FROM句が存在する場合、基本的には、ターゲットテーブルがfrom_itemリストに記載されているテーブルに結合され、結合の各出力行がターゲットテーブルの更新操作を表します。 FROMを使用する場合は、行ごとに結合によって最大で1つの出力行が生成されるようにする必要があります。 つまり、ターゲット行は、他のテーブルから複数の行に結合してはなりません。 そうである場合、ジョイン行のうちの1つだけがターゲット行を更新するために使用されるが、どれが使用されるかは容易に予測できない。

この不確定性のため、サブ選択内でのみ他のテーブルを参照する方が安全ですが、多くの場合、結合を使用するよりも読み取りが難しく、遅くなります。

パーティションテーブルの場合、行を更新すると、格納パーティションのパーティション制約を満たさなくなる可能性があります。 その場合、この行がそのパーティション制約を満たすパーティション・ツリー内に他のパーティションがある場合、その行はそのパーティションに移動される。 そのようなパーティションがない場合、エラーが発生します。 舞台裏では、行の動きは実際には削除挿入の操作です。

移動中の行の同時UPDATEまたはDELETEがシリアル化失敗エラーになる可能性があります。 セッション1がパーティションキーに対してUPDATEを実行している一方で、この行が可視である同時セッション2がこの行に対してUPDATEまたはDELETE操作を実行すると仮定します。 このような場合、セッション2のUPDATEまたはDELETEは行の移動を検出し、シリアル化失敗エラーを発生させます (これは常にSQLSTATEコード '40001' で返されます) 。 これが発生すると、アプリケーションはトランザクションの再試行を望む。 テーブルが分割されていない、または行の移動がない通常の場合、セッション2は、新しく更新された行を識別し、この新しい行バージョンに対してUPDATE /DELETEを実行する。

行はローカルパーティションから外部テーブルパーティションに移動できますが (外部データラッパーがタプルルーティングをサポートしている場合) 、外部テーブルパーティションから別のパーティションに移動することはできません。

UPDATEクエリに記載されている祖先とは異なるソースパーティションの祖先を直接参照する外部キーが見つかった場合、あるパーティションから別のパーティションに行を移動しようとすると失敗します。

テーブルフィルム種類の列でDramaという単語をDramaticに変更します。

UPDATEフィルムSET kind = 'Dramatic 'WHERE kind = 'Drama';

テーブルの天気の1行で、温度エントリを調整し、降水量をデフォルト値にリセットします。

UPDATE天気SET temp_lo = temp_lo + 1、temp_hi = temp_lo + 15、prcp = DEFAULT
      WHERE city = 'San Francisco' AND date = '2003-07-03 '; 

同じ操作を実行し、更新されたエントリを返します。

UPDATE天気SET temp_lo = temp_lo + 1、temp_hi = temp_lo + 15、prcp = DEFAULT
      WHERE city = 'San Francisco' AND date = '2003-07-03'
      リターンtemp_lo、temp_hi、prcp; 

同じ更新を行うには、代替の列リスト構文を使用します。

UPDATE weather SET (temp_lo, temp_hi, prcp) = (temp_lo + 1, temp_lo + 15, DEFAULT)
      WHERE city = 'San Francisco' AND date = '2003-07-03 '; 

Acme Corporationのアカウントを管理する営業担当者の売上数を、FROM句の構文を使用して増分します。

UPDATE従業員SET sales_count = sales_count + 1 FROM accounts
      WHER E accounts.name=「アクメ社」
      AND employees.id = accounts.sales_person; 

WHERE句のサブセレクトを使用して、同じ操作を実行します。

UPDATE従業員SET sales_count = sales_count + 1 WHERE id=
      (SELECT sales_personアカウントからWHERE name = 'Acme Corporation'); 

現在割り当てられている営業担当者と一致するように、アカウントテーブルの連絡先名を更新します。

UPDATEアカウントSET (contact_first_name、contact_last_name) =
        (SELECT first_name, last_name FROMセールスマン
         WHERE salesmen.id = accounts.sales_id); 

結合でも同様の結果が得られます。

UPDATEアカウントSET contact_first_name = first_name、
                        contact_last_name = last_name
      セールスマンWHEREセールスマンから。id = accounts.sales_id; 
説明

ただし、2番目のクエリでは、従業員が予期しない結果になる場合があります。idは一意のキーではありませんが、idが複数一致する場合、最初のクエリではエラーが発生することが保証されます。 また、特定のアカウントに一致するものがない場合。sales_personエントリの場合、最初のクエリは対応する名前フィールドをNULLに設定しますが、2番目のクエリはその行をまったく更新しません。

現在のデータに一致するようにサマリーテーブルの統計を更新します。

UPDATEサマリーs SET (sum_x, sum_y, avg_x, avg_y) =
        (SELECT sum(x), sum(y), avg(x), avg(y) FROM data d
         WHERE d.group_id = s.group_id); 

在庫の量と一緒に新しい在庫アイテムを挿入しようとします。 アイテムがすでに存在する場合は、代わりに既存のアイテムの在庫数を更新します。 トランザクション全体を失敗させずにこれを行うには、savepointsを使用します。

BEGIN;
-その他の操作
SAVEPOINT sp1;
ワインの価値に挿入する ('Chateau Lafite 2003 '、'24');
-一意のキー違反のために上記が失敗したと仮定します。-だから今我々はこれらのコマンドを発行します:
sp1へのロールバック;
UPDATEワインSET stock = stock 24 WHERE winename = 'Chateau Lafite 2003 ';
-他の操作を続け、最終的には
コミット; 

カーソルc_filmsが現在配置されている行のテーブルfilms種類列を変更します。

UPDATE films SET kind = 'Dramatic 'WHERE CURRENT OF c_films;