"নির্বাচন করুন" ব্যবহার না করে টেবিলটি উপস্থিত রয়েছে কিনা তা পরীক্ষা করুন


176

কোনও টেবিল থেকে মানগুলি নির্বাচন না করে এবং এটি পরীক্ষা না করে উপস্থিত রয়েছে কিনা তা যাচাই করার কোনও উপায় আছে কি ?

এটি হ'ল আমি জানি যে আমি SELECT testcol FROM testtableফিরে গিয়ে ক্ষেত্রগুলির গণনা যাচাই করতে পারি , তবে মনে হয় এটি করার জন্য আরও প্রত্যক্ষ / মার্জিত উপায় থাকতে হবে।


উত্তরের জন্য stackoverflow.com/a/167680/12495091 দেখুন !!!!!!!!!
সৌরভ চোপড়া

@ সৌরভচোপড়া এটি এসকিউএল সার্ভারের জন্য, এটি মাইএসকিএল সম্পর্কে জিজ্ঞাসা করছে।
আলেজান্দ্রো

উত্তর:


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
মার্ক এবং আমি যেভাবে এটি করতে বলেছি তা সঠিক উপায়। মাইএসকিউএল-তে কোনও 'বিদ্যমান' টাইপ স্টেটমেন্ট নেই। মাইএসকিউএলে 'অস্তিত্বগুলি' এমন একটি ধারা যার জন্য যেমন নির্বাচন, আপডেট, বা মুছে ফেলার মতো অপারেশন প্রয়োজন।
doogle

@ স্টিভ তৃতীয় বিকল্পটি পোর্টেবল নয়।
ta.speot.is

1
@ সেরজিওটুলেন্টেভ নির্বিশেষে ট্যাগটি আমি মালিকানার পথে বহনযোগ্য উপায় পছন্দ করি।
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 টি সমাধান সরবরাহ করেছিল, তবে এটি সবচেয়ে কার্যকর most আমি যা চাই তার চেয়ে বেশি বা কেন অন্য কিছু নির্বাচন করব? এই ক্ষেত্রে আমার "বুলিয়ান" 1/0 প্রয়োজন need টেবিলটি আছে কি নেই। আমি সব কিছু সীমাবদ্ধ করতে চাই না, আমি কিছু পছন্দ করতে চাই না, আমি কোনও ত্রুটি চাই না। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
ভাসো 123

1
মনে রাখবেন যে এটি কোনও TEMPORARY TABLEকাজ করছে না।
টমাস লকার

27

একটি পারফরম্যান্স তুলনা:

  • মাইএসকিউএল 5.0.77, একটি ডিবিতে প্রায় 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');

দ্রষ্টব্য, যদি আপনি এটি খুব বেশি চালাচ্ছেন - যেমন অল্প সময়ের মধ্যে অনেকগুলি এইচটিএমএল অনুরোধেরও বেশি - দ্বিতীয়টি দ্রুততর হবে যেহেতু এটির গড়পড়তা 200 এমএস বা আরও দ্রুত ক্যাশে রাখা হবে।


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
এই গ্রহণযোগ্য উত্তর করা উচিত। সংক্ষিপ্ত এবং সহজ
ডিকা

এটি কোনও বুলিয়ান ফেরত দেয় না, এটি একটি ফলাফল সেট দেয়। var_dump:mysqli_result Object ( [current_field] => 0 [field_count] => 1 [lengths] => [num_rows] => 1 [type] => 0 )
ক্যামস্লিস

7

ত্রুটির উপর নির্ভর করার পরিবর্তে, আপনি INFORMATION_SCHEMA.TABLESসারণীটি বিদ্যমান কিনা তা জানতে জিজ্ঞাসা করতে পারেন। যদি কোনও রেকর্ড থাকে তবে তা বিদ্যমান। যদি কোনও রেকর্ড না থাকে তবে এর অস্তিত্ব নেই।


1
আহ্, এখন আমরা আরও কাছে আসছি! আমি চেষ্টা করে যাব
বেন

1
@ স্টিভ: এটি এখনও একটি SELECT FROM। :-)
সার্জিও টুলেন্টেসেভ

7

এখানে একটি টেবিল যা কোনও নির্বাচন করুন * থেকে নয়

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

'টেবিল_নাম' এর মতো সারণীগুলি দেখান

যদি এই সারিগুলি> 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

এই উত্তরটি প্রসারিত করে , কেউ একটি ফাংশন লিখতে পারে যা একটি সারণী বিদ্যমান আছে বা নেই তার ভিত্তিতে সত্য / মিথ্যা প্রদান করে:

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 উপস্থিত রয়েছে exist

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 উপস্থিত না থাকলে 1 প্রদান করুন।


0

আমি পিএইচপি এই ব্যবহার করুন।

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) TEMPORARY সারণী অন্তর্ভুক্ত INFORMATION_SCHEMA.TABLESকরে না

২) যেকোন ধরণের 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

এটি আমার 'গো-টু' বিদ্যমান পদ্ধতি যা অস্থায়ী এবং সাধারণ উভয় সারণী পরীক্ষা করে। এই পদ্ধতিটি মাইএসকিউএল সংস্করণ 5.6 এবং তারপরের উপর কাজ করে। @DEBUG প্যারামিটারটি isচ্ছিক। ডিফল্ট স্কিমা ধরে নেওয়া হয়, তবে @s এর বিবৃতিতে টেবিলের সাথে সংমিশ্রিত হতে পারে।

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";
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.