Verifica se la tabella esiste senza utilizzare “seleziona da”

C’è un modo per verificare se esiste una tabella senza selezionare e controllare i valori da essa?

Cioè, so che posso andare SELECT testcol FROM testtable e controllare il conteggio dei campi restituiti, ma sembra che ci debba essere un modo più diretto / elegante per farlo.

Non devi contare nulla.

 SELECT 1 FROM testtable LIMIT 1; 

Se non ci sono errori, la tabella esiste.

Oppure, se vuoi essere corretto, usa INFORMATION_SCHEMA .

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

In alternativa, è ansible utilizzare SHOW TABLES

 SHOW TABLES LIKE 'yourtable'; 

Se c’è una riga nel set di risultati, esiste una tabella.

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

se ottieni un conteggio diverso da zero, la tabella esiste.

Un confronto delle prestazioni:

  • MySQL 5.0.77, su un db che ha circa 11.000 tabelle.
  • Selezione di una tabella non utilizzata di recente in modo che non venga memorizzata nella cache.
  • Media di oltre 10 tentativi ciascuno. (Nota: fatto con tabelle diverse per evitare il caching).

322 ms: show tables like 'table201608';

691 ms: select 1 from table201608 limit 1; tabella201608 select 1 from table201608 limit 1;

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

Nota che se stai facendo un sacco di cose – come su molte richieste HTML in un breve periodo – il secondo sarà molto più veloce dato che verrà memorizzato nella cache di almeno 200 ms o più velocemente.

È ansible eseguire una query sulla vista di sistema delle tables INFORMATION_SCHEMA:

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

Se non viene restituita alcuna riga, la tabella non esiste.

Piuttosto che fare affidamento sugli errori, puoi interrogare INFORMATION_SCHEMA.TABLES per vedere se la tabella esiste. Se c’è un record, esiste. Se non ci sono record, non esiste.

Ecco una tabella che non è un SELECT * FROM

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

Ottenuto da un professionista del database, ecco cosa mi è stato detto:

 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 

mostra tabelle come ‘table_name’

se restituisce righe> 0, la tabella esiste

Solo per aggiungere un ulteriore modo per farlo, e in base a ciò che ti serve, potresti usare un gestore per l’ errore er_no_such_table : 1146 in questo modo:

 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 ; 

Puoi fare qualcosa come di seguito:

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

Lo uso in 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; } 

Questa soluzione modificata dall’alto non richiede una conoscenza esplicita del database corrente. È quindi più flessibile.

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

Nessuna delle opzioni tranne SELECT non consente il nome del database come usato in SELECT, quindi ho scritto questo:

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