コンテンツへスキップ
ホーム » 記事一覧 » SQLのUPDATE文の使い方|安全な更新手順を初心者向けに解説

SQLのUPDATE文の使い方|安全な更新手順を初心者向けに解説

SQLのUPDATE文で対象を確認し、ノートの価格を200円から250円へ変更するイメージ。

商品名の修正や価格の変更など、保存済みのデータを書き換えるときに使うのが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に書かなければ伝わりません。

WHEREで商品番号1の行を選び、SETでノートの価格だけを200円から250円へ変更する。ペン100円とマグカップ800円は変わらない。

安全に更新するための全体の流れ

更新は、SQLを書いてすぐ実行するのではなく、次の順番で進めます。

  1. 接続先と、変えたい行・値・件数を確認する。
  2. SELECTで、同じWHERE条件に当てはまるデータを見る。
  3. UPDATEを実行する。
  4. 更新件数と変更後の値を確認し、確定するか取り消すかを選ぶ。

SELECTはデータを取り出して確認する命令です。先にSELECTで対象を見れば、条件の指定ミスに気付きやすくなります。

また、更新を確認してから確定・取り消しを選べるように、処理をひとまとまりにする仕組みを「トランザクション」と呼びます。今回の練習ではBEGINで開始し、最後にROLLBACKで変更を取り消します。

業務では、接続先が本番か検証用か、作業の承認や復旧の準備が必要かも、チームの手順に沿って確認してください。本番は、利用者が実際に使っている環境です。

同じ接続でBEGIN、対象のSELECT、UPDATE、結果のSELECTと進み、COMMITで確定するかROLLBACKで取り消す。今回の練習はROLLBACKで終える。確定した変更は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;
idnameprice
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は、商品番号の小さい順に並べる指定です。

idnameprice
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;
idnameprice
1A5ノート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;
idnameprice
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件を変えて取り消す流れから試してみましょう。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です