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

时间:2013-10-22 12:45:55

标签: java sql jdbc h2

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

我遵循了this Google Groups question中的建议,但它根本行不通。

如果我运行以下查询:

SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_name = 'word_types'

我返回一行COUNT字段,其值为0;这表示word_types表不存在。但是当我跑步时:

SELECT * FROM word_types

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

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

5 个答案:

答案 0 :(得分:51)

首先:检查您输入表格的情况'名。这非常重要。 word_typesWORD_TYPES是两个不同的表格 第二:如果您想检查表格是否存在以及是否创建表格,我建议您使用以下示例:

CREATE TABLE IF NOT EXISTS TEST(ID INT PRIMARY KEY, NAME VARCHAR(255));

答案 1 :(得分:14)

还有一个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;
}

您也可以使用SQL样式的通配符代替"WORD_TYPES",例如"WORD_%"

请注意,H2的配置设置为DATABASE_TO_UPPER,默认设置为true。因此,任何表名都将转换为大写,这就是为什么您需要以大写形式查询表(或将DATABASE_TO_UPPER设置为false)。

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

结果集还包含有关表的元信息(如果需要),例如架构或表注释。

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

答案 2 :(得分:0)

如果第二个查询没有抛出异常或返回任何行,则只表示该表存在但是为空。

答案 3 :(得分:0)

您的上述查询将返回不存在您的表的记录数,因为您必须触发以下查询。此查询将返回您数据库的所有表,并从那里检查您的“word_types”是否存在。

使用YOURDBNAME 走 选择 * 来自sys.Tables GO

如果有效还是回复我

答案 4 :(得分:0)

path