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