现在我使用的是:
dbResult = dbStatement.executeQuery("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '[e2]' AND table_name = '[emp101_messages]'");
while(dbResult.next())
{
int value = -1;
value= dbResult.getInt(1);
System.out.println(value + " table count");
}
这是检查数据库中是否存在表的正确方法吗?
答案 0 :(得分:5)
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'dbname'
AND table_name = 'my_tablename';
+----------------------+
| table_name |
+----------------------+
| my_tablename |
+----------------------+
由于已经提供了大多数选项。请看看这是否有帮助。
答案 1 :(得分:2)
使用此:
SHOW [FULL] TABLES [{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]
有时您无法访问元数据。
答案 2 :(得分:1)
如果您只想检查是否存在1,2或几个表,为什么不使用:mysql> show tables like "test1";
?
答案 3 :(得分:1)
您也可以使用:
SHOW TABLES LIKE "emp101_messages";
我认为它更有效率。
答案 4 :(得分:1)
这是一种正确的方法。 (只是对你的表名周围的“[]”括号感到困惑 - 这些很可能不是实际名称的一部分,所以需要删除)
此外,这是一种有效的方式:因为您为table_schema
和table_name
提供了常量,所以您使用的是INFORMATION_SCHEMA optimizations,因为表格不是甚至开了:
explain select count(*) from information_schema.tables where table_schema='world' and table_name='City';
+----+-------------+--------+------+---------------+-------------------------+---------+------+------+---------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+-------------------------+---------+------+------+---------------------------------------------------+
| 1 | SIMPLE | tables | ALL | NULL | TABLE_SCHEMA,TABLE_NAME | NULL | NULL | NULL | Using where; Skip_open_table; Scanned 0 databases |
+----+-------------+--------+------+---------------+-------------------------+---------+------+------+---------------------------------------------------+
提供的“SHOW TABLES”解决方案也很好 - 就Java / Python /无论代码而言几乎都是一样的。结果是一个有效的ResultSet:
SHOW TABLES FROM world LIKE 'City';
+------------------------+
| Tables_in_world (City) |
+------------------------+
| City |
+------------------------+
但是要完成这个故事:它不是一个标准的SQL语法 - 所以如果你使用的某些框架就像某些类型的ORM一样,你可能无法总是使用这种类型的查询(就像我一样)召回EJB3不会让你这样做。)
此外,在服务器端解析非常困难,请参阅:Reading results of SHOW statements, on server side,尽管这可能不是您的担忧。