STAGE 06 — 6-2 / データの操作

UPDATEとDELETE

考えてみよう

ケンジが昇給し、給与を書き換えることになりました。すでにある行を「変更する」には、どんな命令を使えばいいでしょう? そしてもし、書き換える対象を間違えてしまったら、何が起きるでしょう?

INSERTは新しい行を追加する命令でした。今回学ぶのは、すでにある行を「変更する」「消す」という、一歩間違えると取り返しがつかなくなることもある操作です。慎重に読み進めてください。

UPDATE ― 既存データを書き換える

すでにある行の値を書き換えるには、UPDATE文を使います。

UPDATE テーブル名
SET 列名 = 新しい値
WHERE 条件;

ケンジの給与を400000円から420000円に上げてみましょう。

UPDATE crew
SET salary = 420000
WHERE name = 'ケンジ';

crew テーブル(変更後、ケンジの行だけ):

idnameroleagehomesalary
2ケンジパイロット35火星420000

SET句が「どの列を、どんな値に変えるか」を指定し、WHERE句が「どの行が対象か」を絞り込みます。複数の列を同時に変えたいときは、カンマで区切って並べます。

UPDATE crew
SET salary = 420000, role = 'チーフパイロット'
WHERE name = 'ケンジ';

WHEREを忘れると全行が対象になる怖さ

ここが、この記事でいちばん大事なところです。もし先ほどのSQLから、WHERE句だけを消してしまったら、どうなるでしょう。

-- 絶対にやってはいけない例
UPDATE crew
SET salary = 420000;

WHERE句がないUPDATE文は、「対象を絞り込む条件がない」=「テーブルの全行が対象」という意味になります。このSQLを実行すると、ユミもサクラもソラも、乗組員全員の給与が一律420000円に書き換わってしまいます。SELECT文ならWHEREを忘れても「全部表示されるだけ」で実害はありませんが、UPDATEとDELETEでWHEREを忘れると、テーブルの中身そのものが壊れます。DELETEでも同じことが起こります。

-- これも絶対にやってはいけない例
DELETE FROM crew;

WHERE句のないDELETE文は、テーブルの行を1件残らず全部消してしまいます。実際の現場で起きるSQLの事故の多くは、この「WHEREを書き忘れた」という単純なミスが原因です。UPDATE・DELETEを書くときは、必ずWHERE句とセットで書く——これを鉄則として体に染み込ませてください。

DELETE ― 行を削除する

行を削除するときは、DELETE文を使います。

DELETE FROM テーブル名
WHERE 条件;

トウマがステーションを離任することになったので、crewテーブルから該当行を削除してみましょう。

DELETE FROM crew
WHERE name = 'トウマ';

crew テーブル(削除後):

idnameroleagehomesalary
1ユミエンジニア24地球320000
2ケンジパイロット35火星420000
3サクラ医師41地球520000
4ハルト医師33450000
5レイ研究員29火星380000
6ミドリパイロット27地球360000
7ソラエンジニア45470000
9アカリエンジニア31火星350000
10リョウパイロット38NULL440000

トウマの行だけが消え、他の行はそのまま残っています。DELETEは行(データ)を消す命令であり、テーブルそのものの形(列や型の定義)は残る、という点も覚えておきましょう。

安全な手順 ― 先にSELECTで確認

UPDATEやDELETEを書くとき、いきなり実行するのではなく、まったく同じWHERE条件でSELECT文を先に実行し、対象になる行を目で確認するのが、経験を積んだ技術者の共通の習慣です。

-- 1. まずSELECTで、対象になる行を確認する
SELECT * FROM crew WHERE name = 'トウマ';

-- 2. 想定どおり1件だけヒットすることを確認してから、
--    同じWHERE条件でDELETEを実行する
DELETE FROM crew WHERE name = 'トウマ';

SELECTの結果が「想定していた行数・想定していた行」と一致していれば、そのままUPDATEやDELETEに切り替えて実行する。もし想定より多くの行がヒットしていたら、そこでWHERE条件を見直せます。このワンクッションが、取り返しのつかないミスを防いでくれます。本番の環境ではバックアップの仕組みなども併用されますが、この「先にSELECTで確認する」習慣は、SQLを書くすべての人にとっての基本です。

確認問題

UPDATE crew SET salary = 400000; というSQLを実行すると、何が起きるでしょう?

答えを見る

WHERE句がないため、crewテーブルの全乗組員の給与が一律400000円に書き換わってしまいます

UPDATE・DELETEでWHERE句を省略すると、「絞り込みなし=全行が対象」という意味になります。実行前に、必ずWHERE句が意図したとおりに書けているか確認する習慣をつけましょう。

ゆみちゃん
ゆみ

UPDATEとDELETEは便利だけど、WHEREを忘れた瞬間に牙をむく——これだけは絶対に覚えておいてほしい。「実行する前に、同じ条件でSELECT」——この一手間が、あなたのデータを守ってくれるよ。

UPDATEやDELETEはテーブルの中身を書き換えたり消したりする命令なので、検索が中心のSQL DIVERでは扱っていません。手元のSQLiteなどで、まずはSELECTで確認してからUPDATE・DELETEを試す——という今回の安全な手順を、実際に自分の手で体験してみるのがおすすめです。