商品名の修正や価格の変更など、保存済みのデータを書き換えるときに使うのがSQLのUPDATE文です。
基本の書き方は短いものですが、対象を指定し忘れると、変更するつもりのなかったデータまで更新してしまいます。
この記事では、商品一覧を例にUPDATE・SET・WHEREの役割と、安全に確認しながら進める手順を解説します。まずは「どの行の、どの値を、何に変えるか」を分けて考えましょう。
💡 このページでわかること
- UPDATE・SET・WHEREの基本の書き方
- SELECTで対象を確認してから更新する手順
- 複数列・複数行の更新と、間違いを防ぐ確認ポイント
UPDATE文とは?保存済みのデータを書き換えるSQL
UPDATE文は、データベースにあるデータの値を書き換える命令です。データベースは情報を整理して保存する仕組みで、その情報を操作するための言語をSQLと呼びます。
データを表の形にまとめたものが「テーブル」です。商品一覧なら、商品1つ分が「行」、商品名や価格などの項目が「列」に当たります。
たとえば「商品番号1のノートを200円から250円に変える」という操作がUPDATEです。行を新しく追加するINSERTや、行を削除するDELETEとは役割が異なります。
SETは変更内容、WHEREは対象の条件
基本の形は次のとおりです。これは書き方の説明なので、このまま実行するものではありません。
UPDATE テーブル名
SET 列名 = 新しい値
WHERE 対象を選ぶ条件;
| 書く場所 | 意味 | 商品の価格を変える場合 |
|---|---|---|
| UPDATEの後ろ | どのテーブルを更新するか | 商品一覧 |
| SETの後ろ | どの列を、どんな値にするか | 価格を250円にする |
| WHEREの後ろ | どの行を対象にするか | 商品番号が1の行 |
SETは「何に変えるか」、WHEREは「どれを変えるか」です。 指定していない列の値は、この基本例では変わりません。
WHEREを省略すると、全行が更新対象になります。「1件だけ変えるつもりだった」という意図は、SQLに書かなければ伝わりません。

安全に更新するための全体の流れ
更新は、SQLを書いてすぐ実行するのではなく、次の順番で進めます。
- 接続先と、変えたい行・値・件数を確認する。
- SELECTで、同じWHERE条件に当てはまるデータを見る。
- UPDATEを実行する。
- 更新件数と変更後の値を確認し、確定するか取り消すかを選ぶ。
SELECTはデータを取り出して確認する命令です。先にSELECTで対象を見れば、条件の指定ミスに気付きやすくなります。
また、更新を確認してから確定・取り消しを選べるように、処理をひとまとまりにする仕組みを「トランザクション」と呼びます。今回の練習ではBEGINで開始し、最後にROLLBACKで変更を取り消します。
業務では、接続先が本番か検証用か、作業の承認や復旧の準備が必要かも、チームの手順に沿って確認してください。本番は、利用者が実際に使っている環境です。

練習用の商品データを用意する
ここからはPostgreSQL 17と、SQLを入力するツール「psql」を使う例です。学習用データベースへ接続済みであることを前提にしています。環境がない場合も、コードと結果表を見比べて読み進められます。
ほかの作業をしていない新しい接続で、次の2つを別々に入力してください。
\conninfo
\echo :AUTOCOMMIT
1つ目で接続中のデータベース名や接続先を確認します。2つ目は、自動コミットという「成功したSQLを自動で確定する設定」の確認です。psqlの標準設定では on と表示されます。on 以外なら、既存の作業設定を変えず、この練習に合う別の接続を用意してください。
準備のSQLは、練習のBEGINを実行する前に、次の順で1文ずつ実行します。自動コミットが有効なので、成功した表の作成とデータの追加はここで確定します。これにより、後のROLLBACKでは練習中の更新だけを取り消せます。
CREATE TEMP TABLE update_practice_products (
id integer PRIMARY KEY,
name text,
price integer,
category text
);
INSERT INTO update_practice_products (id, name, price, category)
VALUES
(1, 'ノート', 200, '文房具'),
(2, 'ペン', 100, '文房具'),
(3, 'マグカップ', 800, '日用品');
CREATE TEMP TABLEは、この接続だけで使う練習用の表を作る命令です。INSERTで3件を入れています。PRIMARY KEYは行を区別するための設定で、この表ではidの重複と未入力を禁止しています。integer は整数、text は文字列を保存するための指定です。
| id(商品番号) | name(商品名) | price(価格・円) | category(分類) |
|---|---|---|---|
| 1 | ノート | 200 | 文房具 |
| 2 | ペン | 100 | 文房具 |
| 3 | マグカップ | 800 | 日用品 |
この一時テーブルは接続を閉じると消えます。ここから最後まで同じ接続を使い、準備中にエラーが出たら、先へ進まず原因を確認してください。練習のBEGIN後にエラーが出た場合は、同じ接続で ROLLBACK; を実行してその練習を終了します。職場のテーブル名へ置き換えて試すためのコードではありません。
STEP1〜4:対象を確かめて1件更新する
今回の目的は「idが1のノートの価格を、200円から250円に変える」です。対象は1件で、ペンとマグカップは変更しません。
コードをまとめて一括実行せず、結果を確認しながら進めましょう。
STEP1:SELECTで対象と件数を確認する
まず、確認から更新までの処理を開始します。
BEGIN;
続いて、更新に使う条件で対象を取り出します。
SELECT id, name, price
FROM update_practice_products
WHERE id = 1;
| id | name | price |
|---|---|---|
| 1 | ノート | 200 |
「ノート・200円の行が1件」であることを確認します。0件だったり、想定した商品と違ったりしたら、UPDATEへ進まないでください。今回の練習ではROLLBACKで処理を終え、接続先や条件を確認してからやり直します。
STEP2:UPDATEで価格を書き換える
対象が合っていたら、次を実行します。
UPDATE update_practice_products
SET price = 250
WHERE id = 1;
SET price = 250 が変更する列と新しい値、WHERE id = 1 が対象の行です。SELECTで確認したWHERE条件をそのまま使っています。最後の半角セミコロン ; は文の終わりを示します。
psqlでは、この例の実行結果として UPDATE 1 が表示される想定です。1行を更新したという意味で、変更を確定したという意味ではありません。
STEP3:変更した行と変更していない行を確認する
同じ接続で、3件すべてを確認します。
SELECT id, name, price
FROM update_practice_products
ORDER BY id;
ORDER BY idは、商品番号の小さい順に並べる指定です。
| id | name | price |
|---|---|---|
| 1 | ノート | 250 |
| 2 | ペン | 100 |
| 3 | マグカップ | 800 |
ノートだけが250円になり、ほかの2件は元の価格のままなら想定どおりです。件数だけでなく、どの行の値が変わったかも確認しましょう。
STEP4:練習の変更を取り消して終える
今回は取り消す操作も試すため、次を実行します。
ROLLBACK;
ROLLBACKは、BEGINから始めた処理内の未確定の変更を取り消す命令です。STEP3のSELECTをもう一度実行すると、ノートの価格は200円へ戻ります。これで、この練習の処理は終了です。
変更を確定する場合に使う命令はCOMMITです。COMMITとROLLBACKは、結果に応じてどちらかを選びます。順番に両方を実行するものではありません。
確定する判断と、その後の確認まで試したい方は、UPDATEしたデータを確定するには?COMMIT前の確認手順へ進んでください。
複数の列・複数の行を更新する書き方
ここからの例は、前の練習をROLLBACKで終え、元の3件へ戻った状態から、1例ずつ試します。どちらの例も、BEGIN→対象のSELECT→UPDATE→結果のSELECT→ROLLBACKの順に分けて実行してください。
複数列はSETをカンマで区切る
ノートの商品名と価格を同時に変更する場合は、SETの後ろを半角カンマ , で区切ります。
1. 開始する
BEGIN;
2. 対象を確認する
SELECT id, name, price
FROM update_practice_products
WHERE id = 1;
ノート・200円の行が1件であることを確認します。想定と違う場合は ROLLBACK; で終了し、更新へ進みません。
3. 商品名と価格を更新する
UPDATE update_practice_products
SET name = 'A5ノート', price = 250
WHERE id = 1;
文字列は 'A5ノート' のように半角のシングルクォートで囲みます。今回の価格のような数値は、そのまま書きます。
4. 件数と結果を確認する
表示される更新件数は UPDATE 1 の想定です。続けて全件を確認します。
SELECT id, name, price
FROM update_practice_products
ORDER BY id;
| id | name | price |
|---|---|---|
| 1 | A5ノート | 250 |
| 2 | ペン | 100 |
| 3 | マグカップ | 800 |
この例では、SETで変える列を増やしても、対象はidが1の行だけです。
5. 取り消して終了する
ROLLBACK;
上の全件を表示するSELECTを再実行し、ノート・200円、ペン・100円、マグカップ・800円に戻ったことを確認します。
複数行はWHEREで対象をまとめて選ぶ
文房具2件の価格を、それぞれ10円上げる場合を考えます。前の練習を取り消した状態から始めます。
1. 開始する
BEGIN;
2. 対象を確認する
SELECT id, name, price
FROM update_practice_products
WHERE category = '文房具'
ORDER BY id;
ノート200円・ペン100円の2件を確認します。想定と違う場合は ROLLBACK; で終了し、更新へ進みません。
3. 2件の価格を更新する
UPDATE update_practice_products
SET price = price + 10
WHERE category = '文房具';
price = price + 10 は、それぞれの行の現在の価格に10を足す指定です。2件とも同じ価格にそろえる指定ではありません。
この式は実行するたびに10円ずつ増えるため、結果が分からないまま再実行しないでください。
4. 件数と結果を確認する
表示される更新件数は UPDATE 2 の想定です。続けて全件を確認します。
SELECT id, name, price
FROM update_practice_products
ORDER BY id;
| id | name | price |
|---|---|---|
| 1 | ノート | 210 |
| 2 | ペン | 110 |
| 3 | マグカップ | 800 |
文房具の2件だけが10円ずつ上がり、マグカップは変わっていないことを確認します。
5. 取り消して終了する
ROLLBACK;
上の全件を表示するSELECTを再実行し、価格が200円・100円・800円に戻ったことを確認します。
初心者が注意するポイント
WHEREがあっても条件が広すぎないか確認する
WHEREを書くだけでは、意図した件数に絞れるとは限りません。商品名や分類が同じ行は、複数ある場合があります。1件だけ変えるなら、この練習のidのように、ほかの行と重複しない番号で指定しましょう。ただし、番号に間違いがないか、商品名や現在の値も確かめます。
更新前には、次の3点を具体的に言えるか確認すると安心です。
- 対象:idが1のノート
- 件数:1件
- 変更内容:価格200円を250円にする
実行する範囲にも注意が必要です。SQL入力ツールで一部を選択して実行する場合、WHEREまで含めた1文全体が選ばれているかを確認してください。
確認中にほかの人が変更する場合もある
事前のSELECTは、その時点の確認です。業務で共有しているテーブルでは、確認後にほかの人やシステムが値を変えることもあります。
今回の一時テーブルは自分の接続専用ですが、業務の共有テーブルでは事情が異なります。PostgreSQLの標準設定では、BEGINの後でも、普通のSELECTで確認した行や値は固定されません。確認後に追加・変更されたデータによって、UPDATE時の対象や値が異なる場合があります。共同で使うデータの更新は、作業時間やほかの更新との調整も含めて担当者に確認しましょう。また、未確定のまま長時間放置すると、ほかの更新を待たせることがあります。
UPDATE文のよくある疑問
0件だったらWHEREを外してよい?
外さないでください。全行を更新する原因になります。PostgreSQLの UPDATE 0 は、更新した行が0件という意味で、それ自体はエラーではありません。まず、接続先・テーブル名・WHEREの値が正しいかをSELECTで確認します。
なお、更新件数の数え方や表示はデータベース・ツールで異なります。PostgreSQLでは、同じ値を入れた行も更新件数に含まれるので、「1件と出たから値も変わった」とは判断できません。
UPDATEすれば必ず確定する?
設定や実行方法によります。今回のようにBEGINで開始した場合は、UPDATE後に確認する時間があります。一方、自動コミットが有効で、明示的に開始していない場合は、成功したUPDATEが自動で確定します。
ほかのデータベース製品では、開始方法や一時テーブルの扱いが異なる場合があります。この記事の練習コードをそのまま流用せず、利用環境の手順を確認してください。
間違えた更新は必ず元に戻せる?
必ず戻せるわけではありません。ROLLBACKで取り消せるのは、そのトランザクション内の未確定の変更です。COMMITや自動コミットで確定した変更は、後からROLLBACKしても戻りません。
業務で誤更新に気付いたら、追加の更新を自己判断で重ねず、実行したSQL・時刻・接続先・結果を記録して担当者へ連絡しましょう。
まとめ・関連記事
UPDATE文は、SETで変更内容、WHEREで対象を指定して、保存済みの値を書き換えます。
安全に進める基本は、更新前に同じ条件のSELECTで対象を確認し、更新後に件数と値を確認することです。まずは練習用の小さな表で、1件を変えて取り消す流れから試してみましょう。
- SQLのSELECT文の使い方|基本構文から条件指定まで初心者向けに解説:対象を取り出す書き方を復習したい方へ。
- UPDATEしたデータを確定するには?COMMIT前の確認手順:変更を確定するまでの確認を学びたい方へ。
- DBを更新したのに反映されないのはなぜ?:実行後の表示が変わらず困ったときに。