Проверьте, существует ли таблица, не используя «select from» - PullRequest
138 голосов
/ 12 января 2012

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

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

Ответы [ 15 ]

264 голосов
/ 12 января 2012

Вам не нужно ничего считать.

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';

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

61 голосов
/ 12 января 2012
SELECT count(*)
FROM information_schema.TABLES
WHERE (TABLE_SCHEMA = 'your_db_name') AND (TABLE_NAME = 'name_of_table')

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

24 голосов
/ 05 августа 2016

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

  • MySQL 5.0.77, на базе данных, содержащей около 11 000 таблиц.
  • Выбор неиспользуемой таблицы, чтобы она не кэшировалась.
  • В среднем более 10 попыток каждая. (Примечание: сделано с разными таблицами, чтобы избежать кеширования).

322мс: show tables like 'table201608';

691мс: select 1 from table201608 limit 1;

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

Обратите внимание, что если вы выполняете это часто - например, во многих HTML-запросах за короткий период - второй будет намного быстрее, поскольку он будет кэшироваться в среднем за 200 мс или быстрее.

15 голосов
/ 12 января 2012

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

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

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

7 голосов
/ 02 августа 2013

Вот таблица, которая не является SELECT * 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
7 голосов
/ 12 января 2012

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

3 голосов
/ 25 октября 2018

Прочитав все вышеперечисленное, я предпочитаю следующее утверждение:

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

Оно точно указывает, что вы хотите сделать, и фактически возвращает «логическое значение».

2 голосов
/ 17 августа 2018

Это модифицированное решение сверху не требует явного знания текущей базы данных. Тогда он становится более гибким.

SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'yourtable' 
AND TABLE_SCHEMA in (SELECT DATABASE());
2 голосов
/ 16 октября 2016

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

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

1 голос
/ 14 марта 2016

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

            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!");
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...