Hôm nay tụi mình sẽ thêm một chiêu cực hay vào kho kiến thức: lệnh RETURNING. Đây là một công cụ mạnh mẽ cho phép bạn lấy ngay dữ liệu cần thiết sau khi insert, update hoặc delete. Thử tưởng tượng bạn vừa chèn một dòng vào bảng và ngay lập tức nhận được id duy nhất của nó. Quá tiện đúng không? Vào học luôn nhé!
Sau khi thực hiện các thao tác INSERT, UPDATE hoặc DELETE, đôi khi bạn sẽ cần lấy ngay dữ liệu vừa bị ảnh hưởng. Ví dụ, sau khi thêm một dòng mới vào bảng, bạn cần biết khóa chính (id duy nhất) được tạo tự động của nó. Thay vì phải gửi thêm một truy vấn SELECT để lấy thông tin này, bạn có thể lấy luôn khi thực hiện thao tác nhờ RETURNING.
Giả sử bạn thêm một sinh viên mới vào bảng students. Mỗi sinh viên đều có một id duy nhất (ví dụ student_id), được tạo tự động. Sau khi thêm bản ghi mới, bạn muốn dùng ngay id này để ghi danh sinh viên vào khóa học. Nếu không có RETURNING, bạn phải insert sinh viên trước, rồi lại gửi truy vấn SELECT để tìm id của bạn ấy. Với RETURNING thì tất cả chỉ cần một truy vấn thôi!
Cú pháp lệnh RETURNING
Lệnh RETURNING được thêm vào cuối các thao tác INSERT, UPDATE và DELETE. Đây là cú pháp tổng quát:
-- INSERT cú pháp:
INSERT INTO bảng (column1, column2, ...)
VALUES (value1, value2, ...)
RETURNING cột;
-- UPDATE cú pháp:
UPDATE bảng
SET column1 = value1
WHERE điều_kiện
RETURNING cột;
-- DELETE cú pháp:
DELETE FROM bảng
WHERE điều_kiện
RETURNING cột;
RETURNING cho phép bạn chỉ định những cột nào của các dòng bị thay đổi mà bạn muốn trả về. Có thể là một cột cụ thể (ví dụ khóa chính) hoặc nhiều cột cùng lúc.
Sử dụng RETURNING với INSERT
Xem ví dụ về bảng students nhé:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT UNIQUE
);
Thêm một sinh viên mới và lấy luôn id của bạn ấy:
INSERT INTO students (first_name, last_name, email)
VALUES ('Otto', 'Lin', 'otto.lin@example.com')
RETURNING student_id;
Truy vấn sẽ trả về id của sinh viên vừa thêm:
| student_id |
|---|
| 1 |
Bạn vừa thêm sinh viên Otto Lin, và PostgreSQL đã trả về luôn student_id của bạn ấy. Quá tiện đúng không?
Bây giờ thử insert và lấy luôn nhiều cột nhé. Nếu bạn cần không chỉ student_id mà còn cả tên và họ của sinh viên, bạn có thể yêu cầu qua RETURNING luôn:
INSERT INTO students (first_name, last_name, email)
VALUES ('Alex', 'Ming', 'alex.ming@example.com')
RETURNING student_id, first_name, last_name;
Kết quả:
| student_id | first_name | last_name |
|---|---|---|
| 2 | Alex | Ming |
Sử dụng RETURNING với UPDATE
Đôi khi sau khi update dữ liệu, bạn muốn biết chính xác dòng nào đã bị thay đổi. RETURNING xử lý chuyện này cực ổn luôn.
Ví dụ, sinh viên Otto Lin muốn đổi email. Update thông tin và lấy luôn dòng vừa đổi nhé:
UPDATE students
SET email = 'lin.new@example.com'
WHERE student_id = 1
RETURNING student_id, email;
Kết quả:
| student_id | |
|---|---|
| 1 | lin.new@example.com |
Bây giờ bạn biết chắc email của sinh viên có student_id = 1 đã được cập nhật thành công.
Sử dụng RETURNING với DELETE
Khi bạn xóa dữ liệu khỏi bảng, đôi lúc sẽ rất hữu ích nếu biết dòng nào đã bị xóa. Với RETURNING bạn có thể lấy thông tin của các dòng vừa bị xóa.
Ví dụ nhé. Giả sử sinh viên Peter Ming bị đuổi học. Xóa bạn ấy khỏi bảng và lấy luôn thông tin về việc xóa:
DELETE FROM students
WHERE student_id = 2
RETURNING student_id, first_name, last_name;
Kết quả:
| student_id | first_name | last_name |
|---|---|---|
| 2 | Peter | Ming |
Bây giờ bạn chắc chắn rằng chính Peter Ming đã bị xóa.
Mẹo thực tế
Luôn dùng RETURNING khi bạn cần dữ liệu của các dòng bị ảnh hưởng. Như vậy sẽ tránh được việc phải gửi thêm truy vấn tới database.
Giảm tối đa lượng dữ liệu trả về. Nếu bạn chỉ cần khóa chính thì chỉ yêu cầu mỗi nó thôi.
Kết hợp với transaction thì RETURNING càng mạnh. Ví dụ, bạn có thể thêm dữ liệu vào nhiều bảng liên quan, truyền id qua lại nhờ RETURNING.
Lỗi thường gặp khi dùng RETURNING
Nhiều bạn mới học hay quên rằng RETURNING chỉ hoạt động với các dòng thực sự bị thay đổi. Ví dụ, nếu truy vấn UPDATE hoặc DELETE không tìm thấy dòng nào, RETURNING sẽ trả về kết quả rỗng. Đừng lo, chuyện này bình thường thôi. Hãy chắc chắn truy vấn của bạn đúng, hoặc xử lý trường hợp này trong code app nhé.
Một lỗi phổ biến nữa: cố dùng RETURNING cho các cột không tồn tại. Nhớ kiểm tra kỹ tất cả các cột bạn yêu cầu phải có trong bảng nha.
Giờ thì bạn đã biết cách dùng RETURNING để làm việc với dữ liệu dễ dàng hơn rất nhiều. Đây là một trong những công cụ mà bạn sẽ cực kỳ thích khi làm app thực tế. Tiến lên nào, chinh phục SQL thôi!
GO TO FULL VERSION