Mã ví dụ đầu tiên ở đây là một thủ tục được lưu trữ thực hiện toàn bộ quá trình trong một bước, cho đến khi người dùng có liên quan.
BEGIN
# zgwp_tables_rowcounts
# TableName RowCount
# Outputs a result set listing all tables and their row counts
# for the current database
SET SESSION group_concat_max_len = 1000000;
SET @sql = NULL;
SET @dbname = DATABASE();
SELECT
GROUP_CONCAT(
CONCAT (
'SELECT ''',table_name,''' as TableName, COUNT(*) as RowCount FROM ',
table_name, ' '
)
SEPARATOR 'UNION '
) AS Qry
FROM
information_schema.`TABLES` AS t
WHERE
t.TABLE_SCHEMA = @dbname AND
t.TABLE_TYPE = "BASE TABLE"
ORDER BY
t.TABLE_NAME ASC
INTO @sql
;
PREPARE stmt FROM @sql;
EXECUTE stmt;
END
Ghi chú:
-
SELECT..INTO @sql tạo truy vấn cần thiết và PREPARE ... EXECUTE chạy nó.
-
Đặt biến group_concat_max_len để cho phép một chuỗi kết quả đủ dài từ GROUP_CONCAT.
Quy trình trên rất hữu ích để xem nhanh trong môi trường quản trị như Navicat hoặc trên dòng lệnh. Tuy nhiên, mặc dù trả về một tập hợp kết quả, theo như tôi biết thì nó không thể được tham chiếu trong một Chế độ xem hoặc Truy vấn khác, có lẽ vì MySQL không thể xác định, trước khi chạy nó, bộ kết quả nào mà nó tạo ra, chứ đừng nói đến những cột nào chúng có .
Vì vậy, vẫn hữu ích khi có thể nhanh chóng sản xuất mà không cần chỉnh sửa thủ công, câu lệnh SELECT ... UNION riêng biệt có thể được sử dụng như một Dạng xem. Điều đó rất hữu ích nếu bạn muốn nối số hàng với một số thông tin trên mỗi bảng từ một bảng khác. Dưới đây là một thủ tục được lưu trữ khác:
BEGIN
# zgwp_tables_rowcounts_view_statement
# Output: SelectStatement
# Outputs a single row and column, containing a (possibly lengthy)
# SELECT...UNION statement that, if used as a View, will output
# TableName RowCount for all tables in the current database.
SET SESSION group_concat_max_len = 1000000;
SET @dbname = DATABASE();
SELECT
GROUP_CONCAT(
CONCAT (
'SELECT ''',table_name,''' as TableName, COUNT(*) as RowCount FROM ',
table_name, ' ', CHAR(10))
SEPARATOR 'UNION '
) AS SelectStatement
FROM
information_schema.`TABLES` AS t
WHERE
t.TABLE_SCHEMA = @dbname AND
t.TABLE_TYPE = "BASE TABLE"
ORDER BY
t.TABLE_NAME ASC
;
END
Ghi chú
-
Rất giống với thủ tục đầu tiên trong khái niệm. Tôi đã thêm dấu ngắt dòng (CHAR (10)) vào mỗi câu lệnh phụ "SELECT ... UNION", để thuận tiện cho việc xem hoặc chỉnh sửa câu lệnh.
-
Bạn có thể tạo điều này dưới dạng một hàm và trả về Câu lệnh Chọn, nếu điều đó thuận tiện hơn cho môi trường của bạn.
Hy vọng điều đó sẽ hữu ích.