यहां पहला उदाहरण कोड एक संग्रहित प्रक्रिया है जो पूरी प्रक्रिया को एक चरण में निष्पादित करती है, जहां तक उपयोगकर्ता का संबंध है।
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
नोट:
-
SELECT..INTO @sql आवश्यक क्वेरी बनाता है, और PREPARE... EXECUTE इसे चलाता है।
-
GROUP_CONCAT से एक लंबी पर्याप्त परिणाम स्ट्रिंग की अनुमति देने के लिए group_concat_max_len चर सेट करता है।
उपरोक्त प्रक्रिया एक व्यवस्थापक वातावरण जैसे कि Navicat, या कमांड लाइन पर त्वरित रूप से देखने के लिए उपयोगी है। हालांकि, परिणाम सेट लौटने के बावजूद, जहां तक मुझे पता है कि इसे किसी अन्य दृश्य या क्वेरी में संदर्भित नहीं किया जा सकता है, संभवतः क्योंकि MySQL यह निर्धारित करने में असमर्थ है, इसे चलाने से पहले, यह कौन सा परिणाम सेट करता है, अकेले उनके पास कौन से कॉलम हैं ।
इसलिए, मैन्युअल संपादन के बिना, एक अलग SELECT...UNION स्टेटमेंट को जल्दी से तैयार करने में सक्षम होना अभी भी उपयोगी है जिसे एक दृश्य के रूप में उपयोग किया जा सकता है। यह उपयोगी है यदि आप किसी अन्य तालिका से किसी अन्य प्रति-तालिका जानकारी के लिए पंक्ति गणना में शामिल होना चाहते हैं। इसके साथ एक और संग्रहित प्रक्रिया:
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
नोट्स
-
अवधारणा में पहली प्रक्रिया के समान ही। मैंने कथन को देखने या संपादित करने में सुविधा के लिए प्रत्येक सहायक "SELECT...UNION" कथन में एक लाइनब्रेक (CHAR(10)) जोड़ा है।
-
आप इसे एक फ़ंक्शन के रूप में बना सकते हैं और SelectStatement वापस कर सकते हैं, यदि यह आपके पर्यावरण के लिए अधिक सुविधाजनक है।
आशा है कि यह मदद करता है।