CodeGym /コース /SQL SELF /RETURNING を使って挿入・更新後にデータを取得する方法

RETURNING を使って挿入・更新後にデータを取得する方法

SQL SELF
レベル 22, レッスン 0
使用可能

今日は知識にもう一つ魔法のピースを追加しよう: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 email
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 を使ってデータ操作がめっちゃ楽になる方法が分かったね。これは実際のアプリを作る時に絶対役立つツールの一つだよ。さあ、新しい世界へレッツゴー!

2
タスク
SQL SELF, レベル 22, レッスン 0
ロック未解除
データ挿入とIDの返却
データ挿入とIDの返却
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION