今天我們要再加一個超實用的技巧給你:RETURNING 指令。這個功能超強,讓你在插入、更新或刪除資料時,馬上就能把需要的資料拿回來。想像一下,你插入一筆資料到表格,然後立刻拿到它的唯一識別碼,是不是超方便?當然啦!來學一下怎麼用吧!
當你做完 INSERT、UPDATE 或 DELETE 這些操作,有時候你會想馬上知道被影響到的資料。例如,插入新的一筆資料後,你想知道它自動產生的主鍵(唯一識別碼)。不用再多打一個查詢來拿這些資料,直接在操作時用 RETURNING 就搞定了。
假設你要加一個新學生到 students 這個表格。每個學生都有一個唯一識別碼(比如 student_id),這個是自動產生的。你加完學生之後,想馬上用這個識別碼去幫學生報名課程。如果沒有 RETURNING,你得先插入學生,再用 SELECT 查詢他的識別碼。有了 RETURNING,一個查詢就搞定!
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 讓你指定要回傳哪些被改動的欄位。你可以只拿一個欄位(像主鍵),也可以一次拿好幾個欄位。
用 RETURNING 搭配 INSERT
來看一個 students 表格的例子:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT UNIQUE
);
加一個新學生,然後馬上拿到他的識別碼:
INSERT INTO students (first_name, last_name, email)
VALUES ('Otto', 'Lin', 'otto.lin@example.com')
RETURNING student_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 |
用 RETURNING 搭配 UPDATE
有時候你更新資料後,會想知道到底改了哪些資料。RETURNING 超適合這種情境。
想像一下,Otto Lin 這個學生要換 email。我們來更新他的資料,然後馬上拿到被改動的那一行:
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 的學生 email 已經成功更新啦。
用 RETURNING 搭配 DELETE
當你從表格刪除資料時,有時候會想知道到底刪掉了哪些資料。有了 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。 這樣可以省掉多餘的資料庫查詢。
回傳的資料越少越好。 如果你只需要主鍵,就只查主鍵就好。
搭配 transaction 用 RETURNING 超強。 例如你要同時加資料到多個有關聯的表格,可以用 RETURNING 傳遞識別碼。
用 RETURNING 常見錯誤
新手常常會忘記 RETURNING 只會回傳有被改動的資料。例如 UPDATE 或 DELETE 查不到資料時,RETURNING 會回傳空結果。別緊張,這很正常。只要確認你的查詢沒寫錯,或是在應用程式裡處理這種情況就好。
還有一個常見錯誤:想用 RETURNING 查不存在的欄位。一定要確認你查的欄位在表格裡真的有。
現在你已經知道怎麼用 RETURNING 讓資料操作變超簡單。這個功能在做真正的應用程式時你一定會愛上!繼續加油,衝刺新技能吧!
GO TO FULL VERSION