MySQL – 检查表是否存在,而不使用“select”

有没有办法来检查一个表是否存在没有select和检查它的价值?

也就是说,我知道我可以去SELECT testcol FROM testtable并检查返回的字段的计数,但似乎必须有一个更直接/优雅的方式来做到这一点。

你不需要数数。

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

如果结果集中有一行,则表存在。

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

如果你得到一个非零计数,表就存在了。

性能比较:

  • MySQL 5.0.77,在有大约11000个表的数据库上。
  • select一个非最近使用的表,这样它不会被caching。
  • 平均每个尝试10次。 (注意:用不同的表格来避免caching)。

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请求 – 第二个将会更快,因为它将平均caching200毫秒或更快。

您可以查询INFORMATION_SCHEMA tables系统视图:

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

如果没有行返回,那么该表不存在。

您可以查询INFORMATION_SCHEMA.TABLES查看表是否存在,而不是依靠错误。 如果有logging,就存在。 如果没有logging,则不存在。

显示像'table_name'

如果这返回行> 0表存在

这是一个不是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 

只是添加一个额外的方式来做到这一点,并根据你需要它可以使用er_no_such_table错误的处理程序 :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 ; 

你可以做如下的事情:

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

我在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; } 

除SELECT之外,没有一个选项不允许在SELECT中使用数据库名称,所以我这样写:

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