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