Thời gian đọc: 13 phút
Bảng tạm (Temporary Table) trong MySQL là một bảng tồn tại trong thời gian ngắn, chỉ được sử dụng trong một phiên làm việc (session) hoặc truy vấn cụ thể. Sau khi phiên làm việc kết thúc hoặc kết thúc truy vấn, bảng tạm sẽ bị tự động xóa mà không cần can thiệp thủ công. Bảng tạm rất hữu ích trong việc lưu trữ tạm thời dữ liệu mà không cần phải tạo bảng vĩnh viễn trong cơ sở dữ liệu.
Cú pháp để tạo bảng tạm trong MySQL như sau:
CREATE TEMPORARY TABLE ten_bang (
cot1 kieu_du_lieu,
cot2 kieu_du_lieu,
...
);
Ví dụ:
CREATE TEMPORARY TABLE temp_users (
user_id INT NOT NULL,
username VARCHAR(50) NOT NULL,
email VARCHAR(100),
PRIMARY KEY (user_id)
);
Giả sử bạn muốn chọn dữ liệu từ bảng users
và thực hiện một số thao tác tạm thời:
CREATE TEMPORARY TABLE temp_users AS
SELECT user_id, username FROM users WHERE active = 1;
Sau khi bảng tạm được tạo, bạn có thể sử dụng nó như một bảng thông thường:
SELECT * FROM temp_users;
Mặc dù bảng tạm sẽ tự động bị xóa khi phiên làm việc kết thúc, nhưng bạn cũng có thể tự tay xóa bảng này khi không cần sử dụng nữa:
DROP TEMPORARY TABLE IF EXISTS temp_users;
Tóm lại, bảng tạm là một công cụ mạnh mẽ và tiện lợi trong MySQL, đặc biệt khi bạn cần xử lý dữ liệu tạm thời mà không cần tạo bảng vĩnh viễn.
Sử dụng bảng tạm trong Stored Procedure (SP) là một cách hiệu quả để xử lý dữ liệu tạm thời trong một quy trình lưu trữ (Stored Procedure) mà không cần tạo bảng vĩnh viễn. Bảng tạm giúp lưu trữ dữ liệu giữa các truy vấn và dễ dàng quản lý, tối ưu hóa xử lý dữ liệu phức tạp trong quy trình.
Dưới đây là cách sử dụng bảng tạm trong Stored Procedure cùng với ví dụ minh họa.
Bạn có thể tạo bảng tạm trong một Stored Procedure giống như cách tạo bảng tạm thông thường. Sau đó, bạn có thể thực hiện các thao tác trên bảng tạm như chèn, cập nhật, hoặc xóa dữ liệu. Khi Stored Procedure kết thúc, bảng tạm sẽ tự động bị xóa.
Cú pháp tổng quan trong Stored Procedure:
DELIMITER //
CREATE PROCEDURE ten_procedure()
BEGIN
-- Tạo bảng tạm
CREATE TEMPORARY TABLE temp_bang (
cot1 kieu_du_lieu,
cot2 kieu_du_lieu
...
);
-- Các thao tác khác trên bảng tạm
INSERT INTO temp_bang (cot1, cot2) VALUES (giatri1, giatri2);
-- Truy vấn bảng tạm
SELECT * FROM temp_bang;
-- Bảng tạm sẽ tự động bị xóa khi SP kết thúc
END //
DELIMITER ;
Giả sử bạn có bảng orders
chứa danh sách đơn hàng và muốn tạo Stored Procedure để lọc những đơn hàng có giá trị lớn hơn 1000, sau đó lưu vào bảng tạm và trả về kết quả.
DELIMITER //
CREATE PROCEDURE GetHighValueOrders()
BEGIN
-- Tạo bảng tạm để lưu các đơn hàng có giá trị lớn hơn 1000
CREATE TEMPORARY TABLE temp_orders AS
SELECT order_id, customer_id, total_value
FROM orders
WHERE total_value > 1000;
-- Lấy danh sách đơn hàng từ bảng tạm
SELECT * FROM temp_orders;
-- Bảng tạm sẽ tự động bị xóa khi kết thúc Stored Procedure
END //
DELIMITER ;
Khi bạn gọi Stored Procedure này, nó sẽ tạo bảng tạm temp_orders
, lưu dữ liệu của các đơn hàng có giá trị lớn hơn 1000 vào đó, và sau đó trả về kết quả:
CALL GetHighValueOrders();
Giả sử bạn cần thực hiện quy trình phức tạp bao gồm việc lấy danh sách đơn hàng, tính toán chiết khấu và lưu vào bảng tạm trước khi trả về kết quả:
DELIMITER //
CREATE PROCEDURE CalculateDiscountedOrders()
BEGIN
-- Tạo bảng tạm để lưu các đơn hàng có chiết khấu
CREATE TEMPORARY TABLE temp_discounted_orders AS
SELECT order_id, customer_id, total_value,
CASE
WHEN total_value > 500 THEN total_value * 0.90 -- Chiết khấu 10%
ELSE total_value
END AS discounted_value
FROM orders;
-- Truy vấn và trả về kết quả từ bảng tạm
SELECT * FROM temp_discounted_orders;
-- Bảng tạm sẽ tự động bị xóa khi kết thúc SP
END //
DELIMITER ;
Trong ví dụ này, bảng tạm temp_discounted_orders
được sử dụng để lưu các đơn hàng với giá trị đã tính chiết khấu. Bảng tạm này giúp tối ưu hóa quy trình, giảm thiểu việc thực hiện nhiều truy vấn phức tạp trên bảng orders
.
Sử dụng bảng tạm trong Stored Procedure là một phương pháp mạnh mẽ để xử lý dữ liệu tạm thời và tối ưu hóa quy trình xử lý trong MySQL. Bảng tạm giúp đơn giản hóa các truy vấn phức tạp, cải thiện hiệu suất và giảm thiểu việc tạo bảng vĩnh viễn trong cơ sở dữ liệu. Tuy nhiên, cần quản lý hợp lý để tránh tác động đến hiệu suất hệ thống.
CURSOR
) để lặp qua từng hàng từ bảng tạmTrong MySQL, không có câu lệnh FOREACH
như trong một số ngôn ngữ lập trình khác, nhưng bạn có thể đạt được kết quả tương tự bằng cách sử dụng cursors (con trỏ) để lặp qua từng hàng trong bảng tạm. CURSOR
là một công cụ trong MySQL cho phép bạn xử lý từng dòng của tập kết quả từ một truy vấn một cách tuần tự.
Dưới đây là ví dụ về cách sử dụng CURSOR
để thực hiện truy vấn FOREACH
trên bảng tạm trong MySQL:
Giả sử bạn có bảng orders
và bạn muốn lưu danh sách các đơn hàng có giá trị lớn hơn 1000 vào bảng tạm, sau đó lặp qua từng đơn hàng để thực hiện một số thao tác.
DELIMITER //
CREATE PROCEDURE ProcessHighValueOrders()
BEGIN
-- Tạo bảng tạm để lưu các đơn hàng có giá trị lớn hơn 1000
CREATE TEMPORARY TABLE temp_orders AS
SELECT order_id, customer_id, total_value
FROM orders
WHERE total_value > 1000;
-- Khai báo biến để lưu trữ dữ liệu tạm thời khi lặp qua con trỏ
DECLARE done INT DEFAULT 0;
DECLARE var_order_id INT;
DECLARE var_customer_id INT;
DECLARE var_total_value DECIMAL(10,2);
-- Khai báo con trỏ để lặp qua từng hàng trong bảng tạm
DECLARE order_cursor CURSOR FOR
SELECT order_id, customer_id, total_value FROM temp_orders;
-- Khai báo handler để bắt sự kiện khi con trỏ hoàn thành việc lặp
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- Mở con trỏ
OPEN order_cursor;
-- Bắt đầu lặp qua từng hàng trong bảng tạm
read_loop: LOOP
FETCH order_cursor INTO var_order_id, var_customer_id, var_total_value;
-- Nếu con trỏ đã lặp qua hết, thoát khỏi vòng lặp
IF done = 1 THEN
LEAVE read_loop;
END IF;
-- Thực hiện thao tác với từng hàng dữ liệu, ví dụ in ra kết quả
SELECT CONCAT('Processing Order ID: ', var_order_id, ' for Customer ID: ', var_customer_id, ' with Total: ', var_total_value) AS processing_result;
-- Bạn cũng có thể thực hiện các thao tác khác như cập nhật, chèn dữ liệu vào bảng khác
END LOOP;
-- Đóng con trỏ sau khi hoàn thành việc lặp
CLOSE order_cursor;
END //
DELIMITER ;
Sau khi tạo Stored Procedure, bạn có thể gọi nó để lặp qua dữ liệu trong bảng tạm và thực hiện thao tác với từng dòng:
CALL ProcessHighValueOrders();
CREATE TEMPORARY TABLE temp_orders AS SELECT ...
lưu trữ các đơn hàng có tổng giá trị lớn hơn 1000 vào bảng tạm temp_orders
.DECLARE order_cursor CURSOR FOR SELECT ...
cho phép bạn lặp qua từng hàng trong bảng tạm temp_orders
.var_order_id
, var_customer_id
, và var_total_value
lưu giá trị của từng hàng khi con trỏ lặp qua dữ liệu.FETCH order_cursor INTO ...
lấy dữ liệu từ con trỏ và lưu vào các biến. Vòng lặp tiếp tục cho đến khi hết hàng trong kết quả.LOOP
, bạn có thể thực hiện các thao tác với dữ liệu, chẳng hạn như in ra kết quả hoặc thực hiện các cập nhật, thêm dữ liệu vào bảng khác.IF done = 1
sẽ thoát khỏi vòng lặp và kết thúc quá trình.Thay vì chỉ in ra dữ liệu, bạn có thể thực hiện các thao tác khác như:
Ví dụ, bạn có thể thêm một bảng để lưu trữ thông tin đơn hàng sau khi xử lý:
INSERT INTO processed_orders (order_id, customer_id, total_value)
VALUES (var_order_id, var_customer_id, var_total_value);
Mặc dù MySQL không có lệnh FOREACH
trực tiếp, nhưng việc sử dụng con trỏ (CURSOR
) trong Stored Procedure cung cấp một cách linh hoạt để duyệt qua từng hàng của một bảng tạm và thực hiện các thao tác trên từng hàng. Điều này rất hữu ích khi bạn cần xử lý dữ liệu phức tạp hoặc cần thực hiện các bước trung gian với dữ liệu tạm thời.