Contoh kode pertama di sini adalah prosedur tersimpan yang melakukan seluruh proses dalam satu langkah, sejauh menyangkut pengguna.
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
Catatan:
-
SELECT..INTO @sql membuat kueri yang diperlukan, dan PREPARE... EXECUTE menjalankannya.
-
Menyetel variabel group_concat_max_len untuk memungkinkan string hasil yang cukup panjang dari GROUP_CONCAT.
Prosedur di atas berguna untuk melihat sekilas di lingkungan admin seperti Navicat, atau di baris perintah. Namun, meskipun mengembalikan set hasil, sejauh yang saya tahu itu tidak dapat direferensikan di Tampilan atau Kueri lain, mungkin karena MySQL tidak dapat menentukan, sebelum menjalankannya, set hasil apa yang dihasilkannya, apalagi kolom apa yang mereka miliki .
Jadi, masih berguna untuk dapat dengan cepat menghasilkan, tanpa pengeditan manual, pernyataan SELECT...UNION terpisah yang dapat digunakan sebagai Tampilan. Itu berguna jika Anda ingin menggabungkan jumlah baris ke beberapa info per tabel lainnya dari tabel lain. Dengan ini prosedur tersimpan lainnya:
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
Catatan
-
Sangat mirip dengan prosedur pertama dalam konsep. Saya menambahkan linebreak (CHAR(10)) ke setiap pernyataan anak perusahaan "SELECT...UNION", untuk kemudahan dalam melihat atau mengedit pernyataan.
-
Anda dapat membuat ini sebagai fungsi dan mengembalikan SelectStatement, jika itu lebih nyaman untuk lingkungan Anda.
Semoga membantu.