35

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

我遵循了这个 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。提前致谢!

4

5 回答 5

70

首先:检查您键入表名的情况。这很重要。word_types并且WORD_TYPES是两个不同的表。
第二:如果要检查表是否存在,如果不存在则创建一个,我建议您使用以下示例:

CREATE TABLE IF NOT EXISTS TEST(ID INT PRIMARY KEY, NAME VARCHAR(255));
于 2013-10-22T13:59:30.847 回答
17

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

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

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

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

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

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

于 2013-11-25T14:46:39.963 回答
0

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

使用 YOURDBNAME GO SELECT * FROM sys.Tables GO

回复我是否有效

于 2013-10-22T13:00:13.933 回答
0

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

于 2013-10-22T12:50:50.887 回答
0
    Connection con = getConnection();
    Boolean tableExist = false;
    PreparedStatement preparedStatement = con.prepareStatement("SHOW TABLES FROM INFORMATION_SCHEMA");
        Boolean rq = preparedStatement.execute();
        if(rq) {
                ResultSet rs = preparedStatement.getResultSet();
                while (rs.next()) {
                    if(rs.getString(rs.getRow()).equals("WORD_TYPES")) {
                        isExist = true;
                        break;
                }
            }
        }
于 2019-01-28T19:48:23.123 回答