Vérifiez si la table existe sans utiliser “select from”

Existe-t-il un moyen de vérifier si une table existe sans sélectionner et vérifier les valeurs de celle-ci?

C’est-à-dire que je sais que je peux utiliser SELECT testcol FROM testtable et vérifier le nombre de champs renvoyés, mais il semble qu’il y ait un moyen plus direct / élégant de le faire.

Vous n’avez pas besoin de compter quoi que ce soit.

 SELECT 1 FROM testtable LIMIT 1; 

S’il n’y a pas d’erreur, la table existe.

Ou, si vous voulez être correct, utilisez INFORMATION_SCHEMA .

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

Alternativement, vous pouvez utiliser SHOW TABLES

 SHOW TABLES LIKE 'yourtable'; 

S’il y a une ligne dans le jeu de résultats, la table existe.

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

Si vous obtenez un compte non nul, la table existe.

Une comparaison de performance:

  • MySQL 5.0.77, sur une firebase database qui compte environ 11 000 tables.
  • Sélection d’une table non récemment utilisée pour qu’elle ne soit pas mise en cache.
  • En moyenne sur 10 essais chacun. (Remarque: faite avec différentes tables pour éviter la mise en 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');

Notez que si vous utilisez beaucoup – comme sur de nombreuses requêtes HTML dans un court laps de temps – le 2ème sera beaucoup plus rapide car il sera mis en cache en moyenne 200 ms ou plus.

Vous pouvez interroger la vue système des tables INFORMATION_SCHEMA:

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

Si aucune ligne n’est retournée, la table n’existe pas.

Plutôt que de compter sur des erreurs, vous pouvez interroger INFORMATION_SCHEMA.TABLES pour voir si la table existe. S’il y a un disque, il existe. S’il n’y a pas de disque, ça n’existe pas.

Voici une table qui n’est pas un SELECT * FROM

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

Voici ce que l’on m’a dit:

 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 

afficher des tableaux comme ‘nom_table’

si cela retourne des lignes> 0 la table existe

Juste pour append un moyen supplémentaire de le faire, et selon ce dont vous avez besoin, vous pourriez utiliser un gestionnaire pour er_no_such_table erreur: 1146 comme ceci:

 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 ; 

Vous pouvez faire quelque chose comme ci-dessous:

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

Je l’utilise en php.

 private static function ifTableExists(ssortingng $database, ssortingng $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; } 

Cette solution modifiée ci-dessus ne nécessite pas une connaissance explicite de la firebase database actuelle. Il est alors plus flexible.

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

Aucune des options, à l’exception de SELECT, n’autorise le nom de firebase database utilisé dans SELECT. J’ai donc écrit ceci:

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