CodeGym /課程 /SQL SELF /使用 RETURNING 來取得插入/更新後的資料

使用 RETURNING 來取得插入/更新後的資料

SQL SELF
等級 22 , 課堂 0
開放

今天我們要再加一個超實用的技巧給你:RETURNING 指令。這個功能超強,讓你在插入、更新或刪除資料時,馬上就能把需要的資料拿回來。想像一下,你插入一筆資料到表格,然後立刻拿到它的唯一識別碼,是不是超方便?當然啦!來學一下怎麼用吧!

當你做完 INSERTUPDATEDELETE 這些操作,有時候你會想馬上知道被影響到的資料。例如,插入新的一筆資料後,你想知道它自動產生的主鍵(唯一識別碼)。不用再多打一個查詢來拿這些資料,直接在操作時用 RETURNING 就搞定了。

假設你要加一個新學生到 students 這個表格。每個學生都有一個唯一識別碼(比如 student_id),這個是自動產生的。你加完學生之後,想馬上用這個識別碼去幫學生報名課程。如果沒有 RETURNING,你得先插入學生,再用 SELECT 查詢他的識別碼。有了 RETURNING,一個查詢就搞定!

RETURNING 指令語法

RETURNING 是加在 INSERTUPDATEDELETE 這些操作的最後面。語法長這樣:

-- 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 email
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 只會回傳有被改動的資料。例如 UPDATEDELETE 查不到資料時,RETURNING 會回傳空結果。別緊張,這很正常。只要確認你的查詢沒寫錯,或是在應用程式裡處理這種情況就好。

還有一個常見錯誤:想用 RETURNING 查不存在的欄位。一定要確認你查的欄位在表格裡真的有。

現在你已經知道怎麼用 RETURNING 讓資料操作變超簡單。這個功能在做真正的應用程式時你一定會愛上!繼續加油,衝刺新技能吧!

2
任務
SQL SELF, 等級 22, 課堂 0
上鎖
插入資料並返回識別碼
插入資料並返回識別碼
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION