MySQL - проверьте, существует ли таблица без использования "select from"

Есть ли способ проверить, существует ли таблица без выбора и проверки значений из нее?

То есть, я знаю, что могу пойти SELECT testcol FROM testtable и проверить количество возвращенных полей, но, похоже, для этого должен быть более прямой/элегантный способ.

Ответ 1

Вам не нужно ничего подсчитывать.

SELECT 1 FROM testtable LIMIT 1;

Если нет ошибки, существует таблица.

Или, если вы хотите быть верным, используйте INFORMATION_SCHEMA.

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

В качестве альтернативы вы можете использовать SHOW TABLES

SHOW TABLES LIKE 'yourtable';

Если в наборе результатов есть строка, таблица существует.

Ответ 2

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

если вы получаете ненулевой счет, таблица существует.

Ответ 3

Сравнение производительности:

  • 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 мс или быстрее.

Ответ 4

Вы можете запросить системный вид INFORMATION_SCHEMA tables:

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

Если строки не вернулись, таблица не существует.

Ответ 5

Вместо того, чтобы полагаться на ошибки, вы можете запросить INFORMATION_SCHEMA.TABLES, чтобы увидеть, существует ли таблица. Если есть запись, она существует. Если нет записи, ее не существует.

Ответ 6

показать таблицы типа 'table_name'

если это возвращает строки > 0, существует таблица

Ответ 7

Вот таблица, которая не является SELECT * FROM

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

Получил это из базы данных pro, вот что мне сказали:

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

Ответ 8

Чтобы добавить дополнительный способ сделать это, и зависит от того, что вам нужно, вы могли бы использовать handler для er_no_such_table error: 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 ;

Ответ 9

Вы можете сделать что-то вроде ниже:

            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!");
            }

Ответ 10

Я использую это в 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;
    }

Ответ 11

Ни один из параметров, кроме SELECT, не позволяет использовать имя базы данных в SELECT, поэтому я написал следующее:

SELECT COUNT(*) AS cnt FROM information_schema.TABLES 
WHERE CONCAT(table_schema,".",table_name)="db_name.table_name";