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

2022-09-01 04:52:55

我正在尝试编写 Java 代码来检查 H2 表是否存在:如果它不存在,它首先执行一个创建表的查询,然后再继续。CREATE TABLE

我遵循了这个Google群组问题中的建议,但它根本不起作用。

如果我运行以下查询:

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

我得到一行,其中的字段值为0;这表示表不存在。但是当我跑步时:COUNTword_types

SELECT * FROM word_types

我得到0个结果集,但我使用的SQL前端/ GUI向我显示了表中存在的所有字段/列。此外,当我向下钻取到数据库的可用表列表(使用相同的 GUI)时,我看到存在。word_typesword_types

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


答案 1

首先:检查键入表名称的情况。这非常重要。 并且是两个不同的表。
第二:如果你想检查表是否存在,如果它不存在,那么创建一个,我建议你使用以下示例:word_typesWORD_TYPES

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

答案 2

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

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

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

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


推荐