CodeGym /Các khóa học /SQL SELF /Làm việc với bảng tạm thời trong PostgreSQL

Làm việc với bảng tạm thời trong PostgreSQL

SQL SELF
Mức độ, Bài học
Có sẵn

Bảng tạm thời là những bảng chỉ tồn tại trong phiên làm việc (session) hoặc giao dịch (transaction) hiện tại thôi. Khi phiên làm việc của bạn kết thúc (hoặc giao dịch đóng lại), bảng tạm thời cùng dữ liệu của nó sẽ biến mất như dấu chân trên cát vậy. Bảng này cực kỳ hợp để lưu trữ dữ liệu tạm, tính toán trung gian hoặc chuẩn bị dữ liệu cho các thao tác phức tạp.

Tại sao lại cần chúng?

  • Lưu trữ dữ liệu tạm thời: Ví dụ, bạn có những phép tính phức tạp cần thực hiện qua nhiều bước. Thay vì làm nặng bảng chính, bạn có thể dùng bảng tạm thời.
  • Phân tích dữ liệu: Bạn có thể gom dữ liệu từ nhiều nguồn, xử lý xong rồi xóa bảng tạm sau khi phân tích xong.
  • Tối ưu hóa truy vấn phức tạp: Đôi khi chia nhỏ truy vấn thành nhiều bước với bảng tạm sẽ giúp chạy nhanh hơn.
  • Giảm rủi ro: Không lo làm hỏng bảng thật — bảng tạm hoàn toàn tách biệt.

Điều hay ho của bảng tạm là dữ liệu trong đó chỉ mình bạn thấy thôi! Người dùng khác trong database không thể nhìn vào, nên bảng tạm rất an toàn để thử nghiệm.

Tạo bảng tạm thời

Tạo bảng tạm thời cũng giống như tạo bảng bình thường, chỉ cần thêm từ khóa TEMP hoặc TEMPORARY thôi.

Cú pháp:

CREATE TEMP TABLE table_name (
    column_name data_type constraints,
    ...
);

Dễ quá đúng không? Bảng tạm sẽ tự động biến mất khi phiên làm việc của bạn kết thúc.

Lấy ví dụ, mình sẽ tạo bảng tạm để lưu thông tin sinh viên:

CREATE TEMP TABLE temp_students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER CHECK (age > 0)
);

Giờ bạn đã có bảng tạm temp_students, có thể insert dữ liệu và thao tác như bảng thường. Nhưng nhớ nhé — bảng này sẽ biến mất khi bạn đóng session.

Tạo bảng tạm từ truy vấn

Đôi khi bạn không muốn tự mô tả cấu trúc bảng tạm — nhất là khi chỉ cần lưu kết quả của một truy vấn nào đó để xử lý tiếp. Lúc này, bạn dùng cú pháp:

CREATE TEMP TABLE tên_bảng AS
SELECT ...;

Cú pháp này không chỉ tạo bảng tạm mà còn tự động đổ dữ liệu từ truy vấn vào luôn.

Giả sử bạn muốn lưu danh sách sinh viên chưa đăng ký khóa học nào:

CREATE TEMP TABLE temp_unregistered_students AS
    SELECT s.id, s.name
    FROM students s
    LEFT JOIN enrollments e ON s.id = e.student_id
    WHERE e.student_id IS NULL;

Bây giờ bạn có bảng temp_unregistered_students để dùng tiếp ở các phần khác của script — khỏi phải lặp lại truy vấn.

Tại sao lại làm vậy?

  • Không cần chỉ rõ cột và kiểu dữ liệu — PostgreSQL tự xác định từ kết quả SELECT.
  • Có thể dùng lại dữ liệu tạm nhiều lần mà không phải tính lại.
  • Rất hữu ích cho báo cáo, ETL và phân tích.

Bảng tạm thời trong giao dịch (transaction)

Bạn có thể tạo bảng tạm trong transaction. Khi transaction kết thúc, bảng tạm cũng tự động bị xóa. Cái này cực kỳ tiện cho những việc mà bạn muốn chắc chắn dữ liệu tạm không còn sót lại trong database. Về transaction mình sẽ nói kỹ hơn ở mấy bài sau — giờ thì cứ tận hưởng cuộc sống vô tư đi nhé :P

Ví dụ:

BEGIN;

CREATE TEMP TABLE temp_transactions (
    transaction_id SERIAL PRIMARY KEY,
    amount NUMERIC(10, 2) NOT NULL,
    status VARCHAR(50)
);

INSERT INTO temp_transactions (amount, status)
VALUES (100.50, 'Đang chờ xử lý');

-- Xem dữ liệu
SELECT * FROM temp_transactions;

COMMIT;
-- Giờ bảng temp_transactions đã biến mất!

Nếu thay vì COMMIT bạn dùng ROLLBACK, dữ liệu và bảng cũng sẽ bị xóa luôn.

Dùng bảng tạm trong các bài toán thực tế

Ví dụ 1: Kết hợp dữ liệu tạm thời

Giả sử bạn có hai bảng: students và courses. Cần xác định ai chưa đăng ký khóa học nào. Ta có thể gom dữ liệu vào bảng tạm trước, rồi phân tích sau.

CREATE TEMP TABLE temp_unregistered_students AS
	SELECT s.id, s.name
	FROM students s
	LEFT JOIN enrollments e ON s.id = e.student_id
	WHERE e.student_id IS NULL;

-- Giờ bạn có thể thao tác với bảng tạm temp_unregistered_students.
SELECT * FROM temp_unregistered_students;

Ví dụ 2: Chuẩn bị dữ liệu cho báo cáo

Đôi khi cần gom dữ liệu từ nhiều bảng, xử lý rồi chuẩn bị báo cáo. Bảng tạm rất hợp cho việc này.

CREATE TEMP TABLE temp_sales AS
	SELECT p.product_id, p.name, SUM(s.quantity) AS total_quantity
	FROM products p
	JOIN sales s ON p.product_id = s.product_id
	GROUP BY p.product_id, p.name;

-- Đã có bảng tạm với kết quả. Giờ có thể làm báo cáo dựa trên nó:
SELECT name, total_quantity FROM temp_sales WHERE total_quantity > 50;

Mẹo và lưu ý về bảng tạm thời

Đặt tên bảng tạm: nếu bạn đã có bảng thường tên students, vẫn có thể tạo bảng tạm cùng tên! Bảng tạm sẽ ưu tiên trong session của bạn. Nhưng nhớ nhé, dễ nhầm nếu quên mình đang dùng bảng tạm.

Tối ưu bảng tạm: PostgreSQL tự động tạo index cho cột có PRIMARY KEY hoặc UNIQUE kể cả trong bảng tạm. Nếu muốn nhanh hơn nữa, bạn có thể tự tạo index:

CREATE INDEX idx_temp_students_age ON temp_students (age);

Xóa bảng tạm: nếu muốn xóa bảng tạm trước khi session kết thúc, dùng lệnh DROP TABLE:

DROP TABLE temp_students;

Dung lượng dữ liệu trong bảng tạm: bảng tạm thường lưu trên RAM (nếu đủ tài nguyên), nên rất nhanh. Nhưng nếu dữ liệu quá lớn thì sẽ chuyển sang lưu trên ổ cứng.

Lỗi thường gặp và cách tránh

Lỗi 1: "Bảng đã tồn tại"

Nếu bạn thử tạo bảng tạm với tên đã trùng với một bảng tạm khác, sẽ bị lỗi. Hãy dùng CREATE TEMP TABLE IF NOT EXISTS hoặc xóa bảng trước khi tạo:

DROP TABLE IF EXISTS temp_students;
CREATE TEMP TABLE temp_students (...);

Lỗi 2: "Bảng biến mất quá sớm"

Nếu bạn tạo bảng tạm trong transaction, nhớ là nó sẽ biến mất khi transaction kết thúc. Hãy lên kế hoạch trước nhé!

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Tạo bảng tạm rỗng
Tạo bảng tạm rỗng
2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Tạo bảng tạm thời từ truy vấn
Tạo bảng tạm thời từ truy vấn
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION