今日は知識にもう一つ魔法のピースを追加しよう:RETURNING コマンドだよ。これは、挿入・更新・削除の後に必要なデータをすぐ返してくれる超便利なツール。例えば、テーブルに行を追加した瞬間、そのユニークIDがすぐ手に入るって想像してみて。便利でしょ?もちろん!じゃあ、やってみよう!
INSERT、UPDATE、DELETE の操作をした後、たまにすぐに影響を受けたデータが欲しい時があるよね。例えば、新しい行をテーブルに追加した後、その自動生成された主キー(ユニークID)が知りたいとか。わざわざ別のクエリでそれを取りに行く代わりに、RETURNING を使えば一発でできるんだ。
例えば、students テーブルに新しい学生を追加する場合を考えてみよう。各学生には自動で生成されるユニークID(例えば student_id)があるよ。新しいレコードを追加した後、そのIDをすぐに使ってコース登録とかしたい場合、RETURNING がなければ、まず学生を追加してから、SELECT でIDを探す必要がある。でも RETURNING なら、全部1つのクエリでOK!
RETURNING コマンドのシンタックス
RETURNING コマンドは INSERT、UPDATE、DELETE の操作の最後に追加するよ。基本の書き方はこんな感じ:
-- INSERT のシンタックス:
INSERT INTO テーブル (column1, column2, ...)
VALUES (value1, value2, ...)
RETURNING カラム;
-- UPDATE のシンタックス:
UPDATE テーブル
SET column1 = value1
WHERE 条件
RETURNING カラム;
-- DELETE のシンタックス:
DELETE FROM テーブル
WHERE 条件
RETURNING カラム;
RETURNING では、変更された行からどのカラムを返してほしいか指定できるよ。主キーだけでもいいし、複数カラムでもOK。
INSERT で RETURNING を使う
例えば students テーブルがあるとする:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT UNIQUE
);
新しい学生を追加して、すぐにそのIDをゲットしよう:
INSERT INTO students (first_name, last_name, email)
VALUES ('Otto', 'Lin', 'otto.lin@example.com')
RETURNING student_id;
このクエリは追加した学生のIDを返してくれる:
| student_id |
|---|
| 1 |
今、Otto Lin という学生を追加して、PostgreSQL がすぐに student_id を教えてくれたよ。便利でしょ?ほんとに!
今度は、複数カラムを一気に返してみよう。student_id だけじゃなくて、名前や苗字も欲しい場合は、RETURNING でそれらも指定できる:
INSERT INTO students (first_name, last_name, email)
VALUES ('Alex', 'Ming', 'alex.ming@example.com')
RETURNING student_id, first_name, last_name;
結果:
| student_id | first_name | last_name |
|---|---|---|
| 2 | Alex | Ming |
UPDATE で RETURNING を使う
データを更新した後、どの行が変わったか知りたい時もあるよね。RETURNING はその時にめっちゃ役立つ。
例えば、学生 Otto Lin がメールアドレスを変えたいとする。そのデータを更新して、変更された行の情報をすぐゲットしよう:
UPDATE students
SET email = 'lin.new@example.com'
WHERE student_id = 1
RETURNING student_id, email;
結果:
| student_id | |
|---|---|
| 1 | lin.new@example.com |
これで student_id = 1 の学生のメールがちゃんと更新されたって分かるね。
DELETE で RETURNING を使う
テーブルからレコードを削除する時、どの行が消えたか知りたいこともあるよね。RETURNING を使えば、削除された行のデータもゲットできる。
例えば、学生 Peter Ming が退学したとしよう。テーブルから削除して、その情報を返してみる:
DELETE FROM students
WHERE student_id = 2
RETURNING student_id, first_name, last_name;
結果:
| student_id | first_name | last_name |
|---|---|---|
| 2 | Peter | Ming |
これで Peter Ming がちゃんと削除されたって分かるね。
実践的なアドバイス
影響を受けた行のデータが必要な時は、いつでも RETURNING を使おう。 これで無駄なクエリを減らせるよ。
返すデータは最小限にしよう。 主キーだけ欲しいなら、それだけ指定しよう。
トランザクションと組み合わせると RETURNING はさらに強力。 例えば、複数の関連テーブルにデータを追加する時、RETURNING でIDを渡しながら処理できるよ。
RETURNING を使う時のよくあるミス
初心者がよくやるのは、RETURNING が変更された行だけに効くって忘れちゃうこと。例えば、UPDATE や DELETE で該当する行がなかったら、RETURNING は空の結果を返す。びっくりしなくて大丈夫。それが普通だよ。クエリが正しいか確認するか、アプリ側でそのケースをちゃんと処理しよう。
もう一つありがちなミスは、存在しないカラムに RETURNING を使おうとすること。指定したカラムがテーブルにちゃんとあるか確認しよう。
これで RETURNING を使ってデータ操作がめっちゃ楽になる方法が分かったね。これは実際のアプリを作る時に絶対役立つツールの一つだよ。さあ、新しい世界へレッツゴー!
GO TO FULL VERSION