H2:如何判断表是否存在?

26 java sql jdbc h2

我正在尝试编写Java代码来检查是否存在H2表:如果它不存在,它首先执行一个CREATE TABLE查询,在进一步继续之前创建表.

我遵循了此Google网上论坛问题中的建议,但它根本不起作用.

如果我运行以下查询:

SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_name = 'word_types'
Run Code Online (Sandbox Code Playgroud)

我用COUNT一个值为0 的字段返回一行; 这表明word_types表不存在.但是当我跑步时:

SELECT * FROM word_types
Run Code Online (Sandbox Code Playgroud)

我得到了0个结果集,但我正在使用的SQL前端/ GUI显示了表中存在的所有字段/列word_types.另外,当我深入查看我的数据库的可用表列表(使用相同的GUI)时,我看到word_types存在.

那么在尝试确定H2表是否存在时使用的正确查询是什么?使用v1.3.173.提前致谢!

qiG*_*uar 54

首先:检查您键入表名称的情况.这很重要.word_types并且WORD_TYPES是两个不同的表.
第二:如果你想检查表是否存在以及是否存在,那么我建议你使用以下示例:

CREATE TABLE IF NOT EXISTS TEST(ID INT PRIMARY KEY, NAME VARCHAR(255));
Run Code Online (Sandbox Code Playgroud)


Ste*_*ler 15

还有一个JDBC API,您可以使用它来查询一个或多个表的存在.这(理论上)比使用的直接查询更便携information_schema.

(实际上,可移植性仍然受到不同DBMS定义和使用概念模式和目录略有不同的事实的限制).

这是它的工作原理:

boolean tableExists = false;

Connection conn = getConnection(); // get a DB connection from somewhere
ResultSet rset = conn.getMetaData().getTables(null, null, "WORD_TYPES", null);
if (rset.next())
{
  tableExists = true;
}
Run Code Online (Sandbox Code Playgroud)

而不是"WORD_TYPES"你也可以使用SQL样式的通配符,例如"WORD_%".

请注意,H2的配置设置DATABASE_TO_UPPERtrue默认设置.因此,任何表名都将转换为大写,这就是您需要以大写形式查询表(或设置DATABASE_TO_UPPERfalse)的原因.

此外,使用其他参数(我在null此处设置),您可以进一步将搜索范围限制为特定的scema或表类型.

结果集还包含有关表的元信息(如果需要),例如模式或表注释.

有关选项和可用元数据的完整列表,请参阅JavaDoc.