अगर "सेलेक्ट" का उपयोग किए बिना टेबल मौजूद है, तो जांचें


176

क्या यह जांचने का कोई तरीका है कि क्या कोई तालिका बिना मूल्यों का चयन और जाँच किए मौजूद है?

यही है, मुझे पता है कि मैं जा सकता हूं SELECT testcol FROM testtableऔर लौट आए खेतों की गिनती की जांच कर सकता हूं , लेकिन ऐसा लगता है कि इसे करने के लिए अधिक प्रत्यक्ष / सुरुचिपूर्ण तरीका होना चाहिए।


उत्तर के लिए stackoverflow.com/a/167680/12495091 पर जाएँ !!!!!!!!!
सौरभ चोपड़ा

@SaurabhChopra यह SQL सर्वर के लिए है, यह MySql के बारे में पूछ रहा है।
अलेजांद्रो

जवाबों:


323

यदि आप सही होना चाहते हैं, तो INFORMATION_SCHEMA का उपयोग करें ।

SELECT * 
FROM information_schema.tables
WHERE table_schema = 'yourdb' 
    AND table_name = 'testtable'
LIMIT 1;

वैकल्पिक रूप से, आप उपयोग कर सकते हैं SHOW TABLES

SHOW TABLES LIKE 'yourtable';

यदि परिणाम में एक पंक्ति है, तो तालिका मौजूद है।


3
हाँ, यह अच्छी तरह से काम करता है और सुरुचिपूर्ण है, लेकिन फिर भी SELECT...FROMवाक्यविन्यास का उपयोग करता है ... मैं कुछ इस तरह की तलाश में थाEXISTS testtable
बेन

9
जिस तरह से मार्क और खुद को ऐसा करने के लिए कहा गया है वह उचित तरीका है। MySql टाइप का कोई 'अस्तित्व' मौजूद नहीं है। MySql में 'एक्ज़िस्ट' एक क्लॉज़ है जिसके लिए SELECT, UPDATE, या DELETE जैसे ऑपरेशन की आवश्यकता होती है।
1

@ तीसरा विकल्प पोर्टेबल नहीं है।
ta.speot.is

1
@SergioTulentsev टैग के बावजूद मैं मालिकाना तरीके से पोर्टेबल तरीका पसंद करता हूं।
ta.speot.is

1
@ यह वास्तव में कोई समस्या नहीं है, क्योंकि वह केवल जाँच कर रहा है कि क्वेरी सफल हुई या नहीं। उस स्थिति में जहां तालिका में कोई पंक्तियां नहीं हैं, क्वेरी अभी भी सफल होगी, बस एक खाली परिणाम सेट के साथ।
बिल डमी

66
SELECT count(*)
FROM information_schema.TABLES
WHERE (TABLE_SCHEMA = 'your_db_name') AND (TABLE_NAME = 'name_of_table')

यदि आपको एक गैर-शून्य गणना मिलती है, तो तालिका मौजूद है।


2
मुझे वास्तव में यह नहीं मिला कि यहाँ क्या हुआ। मैंने उत्तरों की जाँच की है, क्योंकि मैं इसे अभी कर रहा हूं, और यह सच है कि सर्जियो तुलेंत्सेव्स का उत्तर पहले (1 मिनट) था और 3 समाधानों की पेशकश की थी, लेकिन यह सबसे प्रभावी है। मुझे कुछ और क्यों चुनना चाहिए जो मुझे चाहिए? मुझे इस मामले में "बूलियन" 1/0 की आवश्यकता है। टेबल मौजूद है या नहीं। मैं सब कुछ सीमित नहीं करना चाहता, मैं कुछ भी पसंद नहीं करना चाहता, मुझे कोई त्रुटि नहीं चाहिए। यह स्वीकृत उत्तर होना चाहिए।
vaso123

1
ध्यान दें कि TEMPORARY TABLEइस पर काम नहीं हो रहा है।
थॉमस लोब्कर

27

एक प्रदर्शन तुलना:

  • MySQL 5.0.77, एक db पर जिसमें लगभग 11,000 टेबल हैं।
  • गैर-हाल ही में उपयोग की गई तालिका का चयन करना ताकि यह कैश न हो।
  • 10 से अधिक का प्रयास करता है प्रत्येक। (नोट: कैशिंग से बचने के लिए विभिन्न तालिकाओं के साथ किया गया)।

322ms: show tables like 'table201608';

691ms: select 1 from table201608 limit 1;

319ms: SELECT count(*) FROM information_schema.TABLES WHERE (TABLE_SCHEMA = 'mydb') AND (TABLE_NAME = 'table201608');

ध्यान दें कि यदि आप इसे बहुत अधिक चला रहे हैं - जैसे कि थोड़े समय में कई HTML अनुरोध - तो यह तेज़ हो जाएगा क्योंकि यह औसतन 200 ms या अधिक तेज़ होगा।


16

आप INFORMATION_SCHEMA tablesसिस्टम दृश्य को क्वेरी कर सकते हैं:

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'databasename'
AND table_name = 'testtable';

यदि कोई पंक्तियाँ नहीं लौटती हैं, तो तालिका मौजूद नहीं है।


9

उपरोक्त सभी पढ़ने के बाद, मैं निम्नलिखित कथन को पसंद करता हूं:

SELECT EXISTS(
       SELECT * FROM information_schema.tables 
       WHERE table_schema = 'db' 
       AND table_name = 'table'
);

यह वास्तव में इंगित करता है कि आप क्या करना चाहते हैं और यह वास्तव में एक 'बूलियन' लौटाता है।


2
इसका स्वीकृत उत्तर होना चाहिए। संक्षिप्त और सरल
Dika

यह एक बूलियन वापस नहीं करता है, यह एक परिणाम सेट लौटाता है। var_dump:mysqli_result Object ( [current_field] => 0 [field_count] => 1 [lengths] => [num_rows] => 1 [type] => 0 )
camslice

7

त्रुटियों पर भरोसा करने के बजाय, आप यह INFORMATION_SCHEMA.TABLESदेखने के लिए क्वेरी कर सकते हैं कि क्या तालिका मौजूद है। यदि कोई रिकॉर्ड है, तो वह मौजूद है। यदि कोई रिकॉर्ड नहीं है, तो यह मौजूद नहीं है।


1
आह, अब हम करीब हो रहे हैं! मैं एक कोशिश करूँगा।
बेन

1
@ सच: यह अभी भी एक है SELECT FROM। :-)
सर्जियो तुलेंत्सेव

7

यहाँ एक तालिका है जो एक सेलेक्ट * FROM नहीं है

SHOW TABLES FROM `db` LIKE 'tablename'; //zero rows = not exist

डेटाबेस प्रो से यह समझे, यहाँ मुझे बताया गया है:

select 1 from `tablename`; //avoids a function call
select * from IMFORMATION_SCHEMA.tables where schema = 'db' and table = 'table' // slow. Field names not accurate
SHOW TABLES FROM `db` LIKE 'tablename'; //zero rows = not exist

सबसे आसान और कुशल।
e2-e4

3

ऊपर से इस संशोधित समाधान को वर्तमान डेटाबेस के स्पष्ट ज्ञान की आवश्यकता नहीं है। यह तब अधिक लचीला होता है।

SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'yourtable' 
AND TABLE_SCHEMA in (SELECT DATABASE());

2

बस इसे करने के लिए एक अतिरिक्त तरीका जोड़ना है, और इस पर निर्भर करता है कि आपको इसके लिए क्या चाहिए। आप er_no_such_table त्रुटि के लिए एक हैंडलर का उपयोग कर सकते हैं : 1146 इस तरह:

DELIMITER ;;
CREATE PROCEDURE `insert_in_my_table`(in my_var INT)
BEGIN
   -- Error number for table not found
   DECLARE CONTINUE HANDLER FOR 1146
   BEGIN
      -- table doesn't exists, do something...
      CREATE TABLE my_table(n INT);
      INSERT INTO my_table (n) values(my_var);
   END;
      -- table does exists, do something...
      INSERT INTO my_table (n) values(my_var);
END ;;
DELIMITER ;

2

'table_name' जैसी तालिकाएँ दिखाएं

यदि यह पंक्तियों को लौटाता है तो 0 तालिका मौजूद है


1

आप नीचे कुछ ऐसा कर सकते हैं:

            string strCheck = "SHOW TABLES LIKE \'tableName\'";
            cmd = new MySqlCommand(strCheck, connection);
            if (connection.State == ConnectionState.Closed)
            {
                connection.Open();
            }
            cmd.Prepare();
            var reader = cmd.ExecuteReader();
            if (reader.HasRows)
            {                             
              Console.WriteLine("Table Exist!");
            }
            else
            {                             
              Console.WriteLine("Table does not Exist!");
            }

1

इस उत्तर का विस्तार करते हुए , कोई ऐसा फ़ंक्शन लिख सकता है जो तालिका के मौजूद होने या न होने के आधार पर TRUE / FALSE लौटाता है:

CREATE FUNCTION fn_table_exists(dbName VARCHAR(255), tableName VARCHAR(255))
  RETURNS BOOLEAN
  BEGIN
    DECLARE totalTablesCount INT DEFAULT (
      SELECT COUNT(*)
      FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA COLLATE utf8_general_ci = dbName COLLATE utf8_general_ci)
        AND (TABLE_NAME COLLATE utf8_general_ci = tableName COLLATE utf8_general_ci)
    );
    RETURN IF(
      totalTablesCount > 0,
      TRUE,
      FALSE
    );
END
;


SELECT fn_table_exists('development', 'user');

1

यह कॉम्पैक्ट विधि 1 मौजूद है यदि 0 मौजूद है यदि मौजूद नहीं है।

set @ret = 0; 
SELECT 1 INTO @ret FROM information_schema.TABLES 
         WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'my_table'; 
SELECT @ret;

आप एक mysql फ़ंक्शन में डाल सकते हैं

DELIMITER $$
CREATE FUNCTION ExistTable (_tableName varchar(255))
RETURNS tinyint(4)
SQL SECURITY INVOKER
BEGIN
  DECLARE _ret tinyint;
  SET _ret = 0;
  SELECT
    1 INTO _ret
  FROM information_schema.TABLES
  WHERE TABLE_SCHEMA = DATABASE()
  AND TABLE_NAME = _tablename LIMIT 1;
  RETURN _ret;
END
$$
DELIMITER ;

और इसे कॉल करें

Select ExistTable('my_table');

अगर मौजूद नहीं है तो 1 वापस लौटें।


0

मैं इस php में उपयोग करें।

private static function ifTableExists(string $database, string $table): bool
    {
        $query = DB::select("
            SELECT 
                IF( EXISTS 
                    (SELECT * FROM information_schema.COLUMNS
                        WHERE TABLE_SCHEMA = '$database'
                        AND TABLE_NAME = '$table'
                        LIMIT 1),
                1, 0)
                AS if_exists
        ");

        return $query[0]->if_exists == 1;
    }

0

यहाँ उत्तर के साथ ध्यान देने योग्य कई मुद्दे हैं:

1) नहींINFORMATION_SCHEMA.TABLES करता है अस्थायी तालिकाओं में शामिल हैं।

2) किसी भी प्रकार के SHOWक्वेरी का उपयोग करना , अर्थातSHOW TABLES LIKE 'test_table' , एक परिणामी ग्राहक को वापस लौटने के लिए मजबूर करेगा, जो जाँच के लिए अवांछित व्यवहार है कि क्या एक तालिका सर्वर-साइड में मौजूद है, एक संग्रहीत प्रक्रिया के भीतर से जो एक परिणाम भी देता है।

3) जैसा कि कुछ उपयोगकर्ताओं ने उल्लेख किया है, आपको सावधान रहना होगा कि आप कैसे उपयोग करते हैं SELECT 1 FROM test_table LIMIT 1

यदि आप कुछ ऐसा करते हैं:

SET @table_exists = 0;
SET @table_exists = (SELECT 1 FROM test_table LIMIT 1);

यदि तालिका में शून्य पंक्तियाँ हैं, तो आपको अपेक्षित परिणाम नहीं मिलेगा।

नीचे एक संग्रहीत कार्यविधि है जो सभी तालिकाओं (यहां तक ​​कि मंदिर) के लिए काम करेगी ।

इसका उपयोग इस तरह किया जा सकता है:

SET @test_table = 'test_table';
SET @test_db = NULL;
SET @does_table_exist = NULL;

CALL DoesTableExist(@test_table, @test_db, @does_table_exist);

SELECT @does_table_exist;

कोड:

/*
    p_table_name is required
    p_database_name is optional
        if NULL is given for p_database_name, then it defaults to the currently selected database
    p_does_table_exist
        The @variable to save the result to

    This procedure attempts to
        SELECT NULL FROM `p_database_name`.`p_table_name` LIMIT 0;

    If [SQLSTATE '42S02'] is raised, then
        SET p_does_table_exist = 0
    Else
        SET p_does_table_exist = 1

    Info on SQLSTATE '42S02' at:
        https://dev.mysql.com/doc/refman/5.7/en/server-error-reference.html#error_er_no_such_table
*/

DELIMITER $$

DROP PROCEDURE IF EXISTS DoesTableExist
$$

CREATE PROCEDURE         DoesTableExist (
    IN p_table_name VARCHAR(64),
    IN p_database_name VARCHAR(64),
    OUT p_does_table_exist TINYINT(1) UNSIGNED
)
BEGIN
    /* 793441 is used in this procedure for ensuring that user variables have unique names */

    DECLARE EXIT HANDLER FOR SQLSTATE '42S02'
    BEGIN
        SET p_does_table_exist = 0
        ;
    END
    ;


    IF p_table_name IS NULL THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'DoesTableExist received NULL for p_table_name.';
    END IF;


    /* redirect resultset to a dummy variable */

    SET @test_select_sql_793441 = CONCAT(
        "SET @dummy_var_793441 = ("
            " SELECT"
                " NULL"
            " FROM ",
                IF(
                    p_database_name IS NULL,
                    "",
                    CONCAT(
                        "`",
                        REPLACE(p_database_name, "`", "``"),
                        "`."
                    )
                ),
                "`",
                REPLACE(p_table_name, "`", "``"),
                "`"
            " LIMIT 0"
        ")"
    )
    ;

    PREPARE _sql_statement FROM @test_select_sql_793441
    ;
    SET @test_select_sql_793441 = NULL
    ;
    EXECUTE _sql_statement
    ;
    DEALLOCATE PREPARE _sql_statement
    ;

    SET p_does_table_exist = 1
    ;
END
$$

DELIMITER ;

0

यह मेरी 'गो-टू' EXISTS प्रक्रिया है जो दोनों अस्थायी और सामान्य तालिकाओं की जांच करती है। यह प्रक्रिया MySQL संस्करण 5.6 और इसके बाद के संस्करण में काम करती है। @DEBUG पैरामीटर वैकल्पिक है। डिफ़ॉल्ट स्कीमा को मान लिया गया है, लेकिन @ स्टेटमेंट में तालिका में समाप्‍त किया जा सकता है।

drop procedure if exists `prcDoesTableExist`;
delimiter #
CREATE PROCEDURE `prcDoesTableExist`(IN pin_Table varchar(100), OUT pout_TableExists BOOL)
BEGIN
    DECLARE `boolTableExists` TINYINT(1) DEFAULT 1;
    DECLARE CONTINUE HANDLER FOR 1243, SQLSTATE VALUE '42S02' SET `boolTableExists` := 0;
        SET @s = concat('SELECT null FROM `', pin_Table, '` LIMIT 0 INTO @resultNm');
    PREPARE stmt1 FROM @s;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
    set pout_TableExists = `boolTableExists`; -- Set output variable
    IF @DEBUG then
        select IF(`boolTableExists`
            , CONCAT('TABLE `', pin_Table, '` exists: ', pout_TableExists)
            , CONCAT('TABLE `', pin_Table, '` does not exist: ', pout_TableExists)
        ) as result;
    END IF;
END #
delimiter ;

यहाँ @debug के साथ उदाहरण कॉल स्टेटमेंट दिया गया है:

set @DEBUG = true;
call prcDoesTableExist('tempTable', @tblExists);
select @tblExists as '@tblExists';

चर @tblExists एक बूलियन देता है।


-1

SELECT को छोड़कर कोई भी विकल्प डेटाबेस के नाम को SELECT में उपयोग करने की अनुमति नहीं देता है, इसलिए मैंने यह लिखा है:

SELECT COUNT(*) AS cnt FROM information_schema.TABLES 
WHERE CONCAT(table_schema,".",table_name)="db_name.table_name";
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.