2012-06-06 15 views
9

मैं वर्तमान में स्क्रिप्ट का उपयोग कर रहाMySQL डेटाबेस में सभी पंक्तियों

SELECT SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Tables'; 

हालांकि की सटीक गणना, यह सही नहीं है क्योंकि मेरे MySQL तालिकाओं के द्वारा प्रयोग किया इंजन InnoDB है (मैं केवल महसूस किया कि यह समस्या हो सकती है अब, इन डेटाबेसों को थोड़ी देर के लिए अस्तित्व में रखा गया है)।

क्या MySQL के साथ डेटाबेस की प्रत्येक तालिका में प्रत्येक पंक्ति की सटीक गणना करने का कोई तरीका है?

चीयर्स।

+0

क्योंकि मैंने गलती से मेरे उदाहरण में एक 'गिरा दिया' है।मुझे वास्तव में किसी विशेष डेटाबेस में सभी तालिकाओं से पंक्तियों की गणना करने की आवश्यकता है। –

+0

विस्तारित उत्तर: http://stackoverflow.com/questions/24707814/mysql-summarize-all-table-row-counts-in-a-single-query – gwideman

+1

यह http://stackoverflow.com/ का डुप्लिकेट नहीं है प्रश्न/2692340/mysql-गिनती-सभी पंक्तियों-प्रति-टेबल के लिए-इन-वन-क्वेरी। यह प्रश्न विशेष रूप से इनो डीबी टेबल के साथ डेटाबेस के बारे में पूछता है। –

उत्तर

11

मुझे लगता है कि केवल सही (और धीमी) जिस तरह से हर एक मेज के लिए क्या करना है:

SELECT COUNT(*) FROM Table 
+0

@vearutop ड्रैगन जेक ने अपने जवाब में उल्लेख किया है कि इसे प्रत्येक तालिका पर चलाने की आवश्यकता होगी ... –

+1

मैं सबकुछ SQL क्वेरी में नहीं डालूंगा, ऐसा लगता है कि MySQL चर तालिका तालिका से चयन करने में सक्षम नहीं है । तो मैं कम से कम क्वेरी जेनरेटर के साथ आया: 'कंकट चुनें (' चुनें COUNT (*) से, table_name) info_schema.tables से table_schema = 'टेबल्स'; ' – jkrcma

+0

चीयर्स @ ड्रैगनजेक, यह पता चला कि मुझे क्या करना है । :) –

-2

यह मेरे लिए काम किया

<?php 

      mysql_connect("localhost", "root", "pass") or die(mysql_error()); 

      mysql_select_db("csl") or die(mysql_error()); 

      $dtb=mysql_query("SHOW TABLES") or die (mysql_error()); 

      $jmltbl=0; $jml_record=0; $jml_record=0; $total =0; 


      while($row=mysql_fetch_array($dtb)) 

    { 

$sql=mysql_query("select * from $row[0]"); 

$jml_record=mysql_num_rows($sql); 

$total += $jml_record; // this counts all the rows 





$jmltbl++; $jml_record+=$jml_record; 




    } 
     // echo"--------$jmltbl Tables, $jml_record records."; // will print count of indivual table 

echo $total; // this will print you count of all rows in MySQL database 

     ?> 

मैं इस कोड और उसके काम करता है परीक्षण किया है

आउटपुट 1145 मेरे लिए

+0

यह मेरे लिए धीमा नहीं था, यह 1145 की गिनती थी, तुरंत अन्य सभी स्कीमा संबंधित स्कैनियोज़ मेरे लिए काम नहीं कर रहे थे, उन्होंने पूरे डेटाबेस में सभी तालिकाओं की सभी पंक्तियों को वापस करने के लिए नल परिणाम – Rinzler

+1

-1 दिया। '*' के बजाय 'गिनती (*)' का प्रयोग करें। – dotancohen

1

Select Sum(column_Name) from table, पंक्तियों की सटीक गणना नहीं दे सकता एक टेबल, यह कुल पंक्ति गिनती + 1 देगी, अगले पंक्ति को भी सम्मिलित करने वाला पंक्ति देगा। और एक और बात यह है कि sum(Column_Name) में कॉलम_नाम int होना चाहिए, अगर यह वर्चर या चार योग फ़ंक्शन काम नहीं करेगा। इसलिए तालिका में पंक्तियों की सटीक संख्या प्राप्त करने के लिए सबसे अच्छी बात Select Count(*) from table का उपयोग करती है।

ThnQ,

वेंकट

5

यह SQL विवरण एक संघ क्वेरी कि एक ही चरण में कार्य को पूरा कर सकते हैं उत्पन्न करेगा:

SELECT CONCAT('SELECT \'', table_name ,'\' as tbl, (SELECT COUNT(*) FROM ', table_name, ') AS ct UNION') 
FROM information_schema.tables 
WHERE table_schema = 'your_database'; 

एसक्यूएल बयान चलाने के बाद, बस में उत्पादन पेस्ट एक टेक्स्ट एडिटर, आउटपुट के अंत से "यूनियन" शब्द हटाएं, और आपके पास यूनियन क्वेरी होगी।

सावधान रहें कि यूनियन क्वेरी चलाने से आपके डेटाबेस आकार, लोड और हार्डवेयर के आधार पर बहुत सारे संसाधन मिल सकते हैं, ताकि आप इसे एक साथ में चलाने के लिए नहीं चाहें।

0
select table_name,table_rows from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='database name'; 

TABLE_NAME जो "डेटा बेस" में मौजूद है तालिकाओं की संख्या का मतलब है

table_rows प्रत्येक स्तंभ

TABLE_SCHEMA में इसका मतलब संख्या पंक्तियों डेटाबेस नाम है। जिस डेटा बेस पर आप

+1

INFORMATION_SCHEMA में table_rows गिनती Innodb तालिकाओं के लिए सटीक नहीं है, यह केवल एक अनुमान है। – forforf

+1

सहमत हुए। यह गैर-इनओडीबी टेबल के लिए काम करेगा लेकिन विशिष्ट प्रश्न को संबोधित नहीं करता है। –

3

की गणना कर रहे हैं, मुझे वही समस्या थी जिसने मुझे इस प्रश्न का नेतृत्व किया।

कंप्यूटर Guy12345 के उत्तर के लिए धन्यवाद, मैं एक संग्रहित प्रक्रिया के साथ आया था कि कॉपी-पेस्ट किए बिना ऐसा करता है। जैसा कि उसने कहा, सावधान रहें कि यह प्रत्येक तालिका को स्कैन करेगा और इसमें कुछ समय लग सकता है।

DELIMITER $$ 

CREATE PROCEDURE `all_tables_rowcount`(databaseName VARCHAR(250)) 
BEGIN 
DECLARE p_done INT DEFAULT FALSE; 
DECLARE p_queryString varchar(250) ; 
DECLARE p_cur CURSOR FOR SELECT queryString FROM tmp.tableCountQueries; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET p_done = TRUE; 

DROP TEMPORARY TABLE IF EXISTS tmp.tableCountQueries; 
DROP TEMPORARY TABLE IF EXISTS tmp.tableCounts; 

CREATE TEMPORARY TABLE tmp.tableCounts(TableName varchar(250), RowCount BIGINT) ; 

CREATE TEMPORARY TABLE tmp.tableCountQueries(queryString varchar(250)) AS 
(
    SELECT CONCAT(
     'INSERT INTO tmp.tableCounts(TableName, RowCount) SELECT "', 
     table_name, 
     '", COUNT(*) AS RowCount FROM ', 
     table_schema, 
     '.', 
     table_name 
    ) AS queryString 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE table_schema = databaseName 
) ; 

OPEN p_cur; 

read_loop: LOOP 
    FETCH p_cur INTO p_queryString; 
    IF p_done THEN 
     LEAVE read_loop; 
    END IF; 
    SET @queryString = p_queryString ; 
    PREPARE rowcountTable FROM @queryString; 
    EXECUTE rowcountTable ; 
END LOOP; 

SELECT * FROM tmp.tableCounts ; 
END 
+0

यह बहुत उपयोगी है। धन्यवाद! –

संबंधित मुद्दे