Verificar se a tabela existe sem usar “select from”

Existe uma maneira de verificar se existe uma tabela sem selecionar e verificar valores dela?

Ou seja, eu sei que posso ir SELECT testcol FROM testtable e verificar a contagem de campos retornados, mas parece que deve haver uma maneira mais direta / elegante de fazê-lo.

Você não precisa contar nada.

 SELECT 1 FROM testtable LIMIT 1; 

Se não houver erro, a tabela existe.

Ou, se você quiser estar correto, use INFORMATION_SCHEMA .

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

Alternativamente, você pode usar SHOW TABLES

 SHOW TABLES LIKE 'yourtable'; 

Se houver uma linha no conjunto de resultados, a tabela existe.

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

se você obtiver uma contagem diferente de zero, a tabela existe.

Uma comparação de desempenho:

  • MySQL 5.0.77, em um database com cerca de 11.000 tabelas.
  • Selecionando uma tabela não usada recentemente para que não seja armazenada em cache.
  • Média de 10 tentativas cada. (Nota: feito com tabelas diferentes para evitar o cache).

322ms: show tables like 'table201608';

691ms: select 1 from table201608 limit 1;

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

Note que se você estiver executando muito isso – como em muitas solicitações de HTML em um curto período – o segundo será muito mais rápido, já que será armazenado em cache uma média de 200 ms ou mais rápido.

Você pode consultar a visualização do sistema de tables INFORMATION_SCHEMA:

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

Se nenhuma linha for retornada, a tabela não existe.

Em vez de confiar em erros, você pode consultar INFORMATION_SCHEMA.TABLES para ver se a tabela existe. Se há um registro, existe. Se não há registro, não existe.

Aqui está uma tabela que não é um SELECT * FROM

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

Obtive isso de um database pro, aqui está o que me foi dito:

 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 

mostrar tabelas como ‘table_name’

se isso retornar linhas> 0, a tabela existe

Apenas para adicionar uma maneira extra de fazê-lo, e dependendo do que você precisa para você poderia usar um manipulador para erro er_no_such_table : 1146 assim:

 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 ; 

Você pode fazer algo como abaixo:

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

Eu uso isso no 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; } 

Essa solução modificada acima não requer conhecimento explícito do database atual. É então mais flexível.

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

Nenhuma das opções, exceto SELECT, não permite o nome do database, conforme usado no SELECT, então escrevi o seguinte:

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