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.